Phone List HDU - 1671(Trie樹的基本運用)
阿新 • • 發佈:2018-11-06
題意:
給你多個由0-9構成的字串集合,問你這個集合中是否有一個字串是其他字串的字首?
分析:
直接構造字典樹,然後一一插入每個字串,判斷是否有比當前字串短或長的同一路徑的字串已經在樹中了.
#include<bits/stdc++.h> using namespace std; const int maxn = 100111; struct trie { int ch[maxn][10]; int v[maxn]; int sz; void init() { sz=1; v[0]=0; memset(ch[0],0,sizeof ch[0]); } bool insert(char *s) { bool ok=true; int n=strlen(s),u=0; for(int i=0;i<n;i++) { int id=s[i]-'0'; if(ch[u][id]==0) { ch[u][id]=sz; v[sz]=0; memset(ch[sz],0,sizeof ch[sz]); sz++; } u=ch[u][id]; if(v[u]>0)///路徑上有串 ok=false; } v[u]=1;z//是尾節點 if(ok) { for(int i=0;i<10;i++) { if(ch[u][i]!=0) { ok=false;///自己是別的串的字首 break; } } } return ok; } }trie; char s[22]; int main() { int t; cin>>t; while(t--) { int n; cin>>n; trie.init(); bool ok = true; for(int i=0;i<n;i++) { scanf("%s",s); if(ok) ok=trie.insert(s); } if(ok)puts("YES"); else puts("NO"); } }