9:电话号码
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给你一些电话号码,请判断它们是否是一致的,即是否有某个电话是另一个电话的前缀。比如:
Emergency 911
Alice 97 625 999
Bob 91 12 54 26
在这个例子中,我们不可能拨通Bob的电话,因为Emergency的电话是它的前缀,当拨打Bob的电话时会先接通Emergency,所以这些电话号码不是一致的。
输入
-
第一行是一个整数t,1 ≤ t ≤ 40,表示测试数据的数目。
每个测试样例的第一行是一个整数n,1 ≤ n ≤ 10000,其后n行每行是一个不超过10位的电话号码。
输出
- 对于每个测试数据,如果是一致的输出“YES”,如果不是输出“NO”。 样例输入
-
2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
样例输出
-
NO YES
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; bool flag; struct Node { Node*Child[10]; bool flag; Node() { flag=false; memset(Child,0,sizeof(Child)); } }; int main() { int Test; cin>>Test; while(Test--) { int n; string s; flag=false; cin>>n; Node *root=new Node(); while(n--) { cin>>s; if(flag)continue; int len=s.length(); Node*p=root; for(int i=0;i<len;++i) { if(i==len-1&&p->Child[s[i]-'0']!=NULL) { flag=true;break; } if(p->Child[s[i]-'0']==NULL) { p->Child[s[i]-'0']=new Node(); } p=p->Child[s[i]-'0']; if(p->flag) { flag=true;break; } } if(!flag) p->flag=true; } if(flag)cout<<"NO"<<endl; else cout<<"YES"<<endl; } return 0; }