POJ 3630 Phone List(字典樹,公共字首問題)
阿新 • • 發佈:2019-01-31
題意:給出n個數字串,問其中是否有一個串是另一個串的字首。
tire的基礎應用
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; #define M 100100 struct node { node *son[10]; bool flag; }trie[M],*root; char s[15]; struct Trie { int sz; node* createnode() { trie[sz].flag=false; memset(trie[sz].son,0,sizeof(trie[sz].son)); return &trie[sz++]; } void ini() { sz=0; root=createnode(); } bool Insert(char str[]) { node *cur=root; int val; int len=strlen(str); for(int i=0;i<len-1;i++) { val=str[i]-'0'; if(cur->son[val]==NULL) { cur->son[val]=createnode(); } else if(cur->son[val]->flag) return true; cur=cur->son[val]; } val=str[len-1]-'0'; if(cur->son[val]!=NULL) return true; else { cur->son[val]=createnode(); cur->son[val]->flag=true; return false; } } }tr; int main() { int T; scanf("%d",&T); while(T--) { tr.ini(); bool flag=0; int m; scanf("%d",&m); while(m--) { scanf("%s",s); if(flag) continue; flag=tr.Insert(s); } if(flag) puts("NO"); else puts("YES"); } return 0; }