Vijos P1028 魔族密碼(Trie解法)
阿新 • • 發佈:2017-08-05
+= 否則 space pac 殺死 mes 系統 順序 給定
描述
風之子剛走進他的考場,就……
花花:當當當當~~偶是魅力女皇——花花!!^^(華麗出場,禮炮,鮮花)
風之子:我嘔……(殺死人的眼神)快說題目!否則……-_-###
花花:……咦~~好冷~~我們現在要解決的是魔族的密碼問題(自我陶醉:搞不好魔族裏面還會有人用密碼給我和菜蟲寫情書咧,哦活活,當然是給我的比較多拉*^_^*)。魔族現在使用一種新型的密碼系統。每一個密碼都是一個給定的僅包含小寫字母的英文單詞表,每個單詞至少包含1個字母,至多75個字母。如果在一個由一個詞或多個詞組成的表中,除了最後一個以外,每個單詞都被其後的一個單詞所包含,即前一個單詞是後一個單詞的前綴,則稱詞表為一個詞鏈。例如下面單詞組成了一個詞鏈:
i
int
integer
但下面的單詞不組成詞鏈:
integer
intern
現在你要做的就是在一個給定的單詞表中取出一些詞,組成最長的詞鏈,就是包含單詞數最多的詞鏈。將它的單詞數統計出來,就得到密碼了。
風之子:密碼就是最長詞鏈所包括的單詞數阿……
花花:活活活,還有,這些文件的格式是,第一行為單詞表中的單詞數N(1<=N<=2000),下面每一行有一個單詞,按字典順序排列,中間也沒有重復的單詞咧!!你要提交的文件中只要在第一行輸出密碼就行啦^^看你長得還不錯,給你一個樣例吧:
樣例1
樣例輸入1
5
i
int
integer
intern
internet
樣例輸出1
4
限制
各個測試點1s
來源
Vivian Snow
From 正·蠢盟演義——戰略版 Fools-League Tactics
【分析】
Vijos的數據比較弱,之前用Lis就過了,但是在機房過不了,改用Trie試一下。
【代碼】
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 char s[80]; 5 int n, ans, val[2010], sz=1, tree[2010][26]; 6 7 void insert(char str[]) { 8 int u=0, tot=1, n=strlen(str), k; 9 for (int i=0;i<n;++i) { 10 k=str[i]-‘a‘; 11 if (!tree[u][k]) { 12 //memset(tree[sz], 0, sizeof tree[sz]); 13 val[sz]=0; 14 tree[u][k]=sz++; 15 } 16 tot+=val[u]; 17 u=tree[u][k]; 18 } 19 val[u]++; 20 ans=max(ans, tot); 21 } 22 23 int main() 24 { 25 cin >> n; 26 for (int i=1;i<=n;++i) { 27 scanf("%s", s); 28 insert(s); 29 } 30 cout << ans <<endl; 31 }
Vijos P1028 魔族密碼(Trie解法)