題目描述
kkksc03是個非凡的空想家!在短時間內他設想了大量網頁,然後總是交給可憐的lzn去實現。
洛谷的網頁端,有很多文件夾,文件夾還套着文件夾。
例如:/luogu/application/controller表示根目錄下有一個名稱爲luogu的文件夾,這個文件夾下有一個名稱application的文件夾,其中還有名爲controller的文件夾。
每個路徑的第1個字符總是’/’,且沒有兩個連續的’/’,最後的字符不是’/’。所有名稱僅包含數字和小寫字母。
目前根目錄是空的。kkksc03想好了很多應該有的文件夾路徑名。問題是,需要是使這些文件夾都存在,需要新建幾個文件夾呢?
輸入格式
輸入文件第1行爲一個正整數N。
接下來N行,每行爲一個描述路徑的字符串,長度均不超過100。
輸出格式
輸出應包含N行,每行1個正整數,第i行輸出若要使第1個路徑到第i個路徑存在,最少需要新建多少個文件夾。
輸入輸出樣例
輸入 #1複製
2 /luogu/application/controller /luogu/application/view
輸出 #1複製
3 4
輸入 #2複製
3 /chicken /chicken/egg /chicken
輸出 #2複製
1 2 2
輸入 #3複製
4 /a /a/b /a/c /b/b
輸出 #3複製
1 2 3 5
說明/提示
數據規模:
對於所有數據,N<=1000。
對於20%數據,有N<=20;
對於50%數據,有N<=200;
對於30%數據,有對於所有路徑最多存在兩個’/’(包含第1個字符)。
思路
因爲文件夾名稱可能出現重複,所以可以用set來做。
#include <stdio.h>
#include <iostream>
#include <set>
#include <string>
using namespace std;
set<string> st[51];
string a,b;
int n,s;
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
register int i,j;
cin>>n;
for(i=0;i<n;i++)
{
cin>>a;
int cnt(0);
b="";
for(j=1;j<a.size();j++)//從1開始是因爲根目錄的'/'不要算上
{
if(a[j]!='/') b=b+a[j];
if(a[j]=='/')
{
st[cnt++].insert(b);
b=b+a[j];
}
if(j==a.size()-1)//最後一個字符,要保存目錄
{
st[cnt].insert(b);
}
}
s=0;
for(j=0;j<51;j++)
{
s+=st[j].size();
}
cout<<s<<endl;
}
return 0;
}