問題描述
在進行文法分析的時候,一般須要檢測一個單詞是否在咱們的單詞列表裏。爲了提升查找和定位的速度,一般都畫出與單詞列表所對應的單詞查找樹,其特色以下:c++
根結點不包含字母,除根結點外每個結點都僅包含一個大寫英文字母;數組
從根結點到某一結點,路徑上通過的字母依次連起來所構成的字母序列,稱爲該結點對應的單詞。單詞列表中的每一個單詞,都是該單詞查找樹某個結點所對應的單詞;atom
在知足上述條件下,該單詞查找樹的結點數最少。spa
例以下圖左邊的單詞列表就對應於右邊的單詞查找樹。注意,對一個肯定的單詞列表,請統計對應的單詞查找樹的結點數(包含根結點)。code
輸入格式
爲一個單詞列表,每一行僅包含一個單詞和一個換行 "/" 回車符。每一個單詞僅由大寫的英文字母組成,長度不超過 63 個字母 。文件總長度不超過 32K ,至少有一行數據。orm
輸出格式
僅包含一個整數,該整數爲單詞列表對應的單詞查找樹的結點數xml
樣例一
input
A AN ASP AS ASC ASCII BAS BASICoutput
13數據範圍與約定
時間限制: 1s1sblog
內存限制: 256MB256MB256MB排序
頭一次見string類型這樣用2333ip
就是說:例如
string a[500];
這樣的變量a是能夠變爲二維數組的;
好比:a[i][j] 就表示了字符串a這個集合中有字符串a[i];而a[i][j]表示串a的第j個字符;
並且,原來string自帶.size();不再用sizeof()了qwq
看來我基礎並不過關
好了上代碼:
其實我是爆搜的:
(怕不是出題人懶得寫數據
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=100010; 4 string dan[maxn];//單詞的集合 5 int ans; 6 int main(){ 7 int i=1; 8 while (cin>>dan[i]) i++; //讀入數據 9 int n=i-1; //最後多加了一個1 10 sort (dan+1,dan+1+n); //將字符串排序,注意,是串的排序而不是字符的 11 ans=dan[1].size()+1; //最小那個鐵定是樹的一條鏈 12 for(int i=2;i<=n;i++){ 13 int j=0; //每次初始化j,保證剛開始掃的時候j沒有值 14 while (dan[i][j]==dan[i-1][j]) { 15 j++; //統計有多少個字母同樣能夠合併 16 } 17 ans+=(dan[i].size()-j); //每次加上不同的,即節點 18 } 19 cout<<ans; //輸出 20 return 0; 21 }