Phone List [trie樹]
阿新 • • 發佈:2018-12-30
我們邊插入邊判斷 ,
首先要判斷插入的串有沒有包含其它的串 , 我們邊插入邊看節點有沒有值就可以了
其次要判斷這個串有沒有被包含 , 我們插入的時候看有沒有新增節點就好
#include<bits/stdc++.h> #define N 10050 using namespace std; int ch[N*15][15],val[N*15],tot,T,n; void Init(){ memset(ch,0,sizeof(ch)); memset(val,0,sizeof(val)); tot=0; } bool Insert(string s){ int len = s.length(),now=0,cnt=0; for(int i=0;i<len;i++){ int pos = s[i]-'0'; if(!ch[now][pos]) ch[now][pos] = ++tot,cnt++; if(val[ch[now][pos]]) return false; now = ch[now][pos]; } if(!cnt) return false; val[now] ++; return true; } int main(){ scanf("%d",&T); while(T--){ scanf("%d",&n); Init(); int flag=0; while(n--){ string s; cin>>s; if(!Insert(s)){flag=1; break;} } while(flag && n--){string s; cin>>s;} if(!flag) printf("YES\n"); else printf("NO\n"); } return 0; }