1. 程式人生 > >【BZOJ1174】: [Balkan2007]Toponyms

【BZOJ1174】: [Balkan2007]Toponyms

→原題←

↑這樣子我就不復制題面啦~

就是一題很裸的字典樹而已,不過空間卡的很死,直接開個陣列 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 }