一道简单的字典树,需要判断号码是否包含其它号码,或者包含于其它号码,在更新字典树时判断即可
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<queue> using namespace std; #define N 10005 int tot; int flag; int trie[N*10][10]; int vis[N*10]; void update(char *s,int rt) { for(int i=0;s[i];i++) { int x=s[i]-'0'; if(!trie[rt][x]) { trie[rt][x]=++tot; } rt=trie[rt][x]; if(vis[rt]) flag=1;//如果包含其他号码 } for(int i=0;i<=9;i++) if(vis[trie[rt][i]]) flag=1;//如果包含于其他号码 vis[rt]=1; } char s[15]; int main() { int t; scanf("%d",&t); while(t--) { int n; tot=0; flag=0; scanf("%d",&n); getchar(); memset(trie,0,sizeof(trie)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { gets(s); update(s,0); } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }
向室友学了一下结构体实现的字典树
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<map> #include<queue> using namespace std; #define N 10005 int tot; int flag; struct node { int ch[11]; int vis; void init() { memset(ch,0,sizeof(ch)); vis=0; } }trie[100005]; void update(char *s,int rt) { for(int i=0;s[i];i++) { int x=s[i]-'0'; if(!trie[rt].ch[x]) { trie[rt].ch[x]=++tot; trie[tot].init(); } rt=trie[rt].ch[x]; if(trie[rt].vis) flag=1; } for(int i=0;i<=9;i++) if(trie[rt].ch[i]) flag=1; trie[rt].vis=1; } char s[15]; int main() { int t; scanf("%d",&t); while(t--) { int n; tot=0; flag=0; scanf("%d",&n); getchar(); trie[0].init(); for(int i=0;i<n;i++) { gets(s); update(s,0); } if(flag) printf("NO\n"); else printf("YES\n"); } return 0; }