【BZOJ1174】: [Balkan2007]Toponyms
阿新 • • 發佈:2018-11-07
↑這樣子我就不復制題面啦~
就是一題很裸的字典樹而已,不過空間卡的很死,直接開個陣列 tr[N][52] 什麼之類的一定會RE的(慘痛的教訓)
當字典樹空間不夠而時間限制又比較寬鬆時,我們可以像平時前向星存圖那樣動態地為字典樹開點(哪一個字典樹不是動態開點。。
總之把陣列大小開到最極限的 5e6 可以勉強通過此題。
我讀入時使用了 getline 這樣子會很慢啦,可以直接巧妙地一個個 getchar 的(好在BZOJ上限制的是10秒)
程式碼~
1 #include<iostream>
2 #include<cstdio>
3 #include<cstdlib>
4 #include<cstring>
5 #include<algorithm>
6
7 #define For(i,a,b) for(register int i=a;i<=b;++i)
8 #define Re register
9
10 using namespace std;
11 const int N=5e6+10;
12 int head[N],nxt[N],key[N],v[N],cnt[N],ct=1;
13 int ans=0,n,BH=1;
14 string s;
15
16 void Ins(){
17 int len=s.size();
18 int Px=0,dep=0,now=1;
19 while(Px<len){
20 bool hK=0;
21 for(Re int i=head[now];i;i=nxt[i]){
22 int vv=v[i];
23 if(key[vv]==s[Px]){
24 now=vv; hK=1; break;
25 }
26 }
27 if(!hK){
28 ct++;
29 nxt[ct]=head[now]; head[now]=ct; v[ct]=++BH;
30 now=BH;
31 key[now]=s[Px];
32 }
33 cnt[now]++;
34 dep++;
35 ans=max(ans,dep*cnt[now]);
36 Px++;
37 }
38 }
39
40 int main(){
41 cin>>n;
42 char c=getchar();
43 For(i,1,n){
44 getline(cin,s);
45 Ins();
46 }
47 cout<<ans<<endl;
48 return 0;
49 }