标签:
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11669 Accepted Submission(s): 3970
1 #include<cstring> 2 #include<cstdio> 3 #include<iostream> 4 #include<string> 5 6 using namespace std; 7 #define maxn 1000900 8 9 int dic[maxn][15],val[maxn],flag,cnt; 10 11 void inst(string s) 12 { 13 int u=0,v,len; 14 len=s.length(); 15 for(int i=0;i<len;i++) 16 { 17 v=s[i]-‘0‘; 18 if(!dic[u][v]) 19 { 20 dic[u][v]=++cnt;// 构造链表 21 memset(dic[cnt],0,sizeof(dic[cnt]));//优化 22 } 23 u=dic[u][v]; //u节点与v节点相连 dic的值指向下一个节点 24 if(i==len-1) val[u]++;// 标记该字符串结束位置 25 } 26 } 27 28 void get(string s) 29 { 30 int u=0,v,len; 31 len=s.length(); 32 for(int i=0;i<len-1;i++) 33 { 34 v=s[i]-‘0‘; 35 if(val[dic[u][v]]) //如果该字符串结束之前发现有其他字符串结束点 说明产生前缀 36 { 37 flag=0; 38 return ; 39 } 40 u=dic[u][v]; 41 } 42 } 43 44 int main() 45 { 46 int T; 47 scanf("%d",&T); 48 while(T--) 49 { 50 int n; 51 string s[100000]; 52 scanf("%d",&n); 53 memset(dic[0],0,sizeof(dic[0])); 54 memset(val,0,sizeof(val)); 55 cnt=0; 56 flag=1; 57 for(int i=0;i<n;i++) 58 { 59 cin>>s[i]; 60 if(flag) inst(s[i]); // 这里以及下面最好都优化一下 不然会T 61 if(flag) get(s[i]); 62 } 63 for(int i=0;i<n&&flag;i++) 64 if(flag) get(s[i]); 65 else break; 66 if(flag) printf("YES\n"); 67 else printf("NO\n"); 68 } 69 }
标签:
原文地址:http://www.cnblogs.com/wsaaaaa/p/4293628.html