标签:int 入门 strlen c++ col end name 存在 one
就Trie的插入和查找
//注意此题是找到前缀输出no,否则输出yes #include<bits/stdc++.h> using namespace std; int n,t,flag,cnt,trie[110001][21]; int ed[110001],vis[110001]; char ch[21]; void up() { flag=0;cnt=0; memset(ed,0,sizeof(ed)); memset(vis,0,sizeof(vis)); memset(trie,0,sizeof(trie)); } void find() { int nxt=0,len=strlen(ch+1); for(int i=1;i<=len;i++) { int num=ch[i]-‘0‘; if(!trie[nxt][num]) trie[nxt][num]=++cnt; nxt=trie[nxt][num]; //取出它的下一条边 if(vis[nxt]&&i==len) //如果这条边已存在,且i==len,则说明找到前缀 { flag=1; return; } vis[nxt]=1; // 加入这条边到trie中 if(ed[nxt]) //如果这条边被打上结尾标记的话 { flag=1; return; } } ed[nxt]=1; //打上结尾标记 } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n);up(); for(int i=1;i<=n;i++) { scanf("%s",ch+1); if(!flag) { find(); } } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; } #include<cstring> #include<iostream> using namespace std; int a[100010][11],tot,End[100010]; void ins(char *str) { int n=strlen(str),p=0; for(int i=0;i<n;i++) { int l=str[i]-‘0‘; if(!a[p][l])a[p][l]=++tot; p=a[p][l]; End[p]++; } } int find(char *str) { int n=strlen(str),p=0; for(int i=0;i<n;i++) { int l=str[i]-‘0‘; p=a[p][l]; if(!p)return 0; } return End[p]-1; //因为在查找的时候,一定会找到自己,所以要减去1 //这样才能知道是否存在其它字符串是其子串 } char str[10010][11]; int main() { int t; scanf("%d",&t); while(t--) { tot=0; memset(a,0,sizeof(a)); memset(str,0,sizeof(str)); memset(End,0,sizeof(End)); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%s",str[i]); ins(str[i]); } bool flag=0; for(int i=1;i<=n;i++) if(find(str[i])) { flag=1; break; } printf(flag==1?"NO\n":"YES\n"); } return 0; }
标签:int 入门 strlen c++ col end name 存在 one
原文地址:https://www.cnblogs.com/cutemush/p/12252741.html