题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1671
题意:
t组测试样例,每组n个字符串,问是否有电话号码是其他电话号码的前缀;
分析:
由于只有可能是短的电话号码是长电话号码的前缀,所以输入所有的号码,然后根据长度排个序,从大到小,然后遍历,看当前字符串是否是已存在字符串的前缀,如果是,那就输出"NO",判断之后将当前字符串插进去,最后输出NO;
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cmath>
#include<set>
#include<map>
using namespace std;
const int inf=0x7f7f7f7f;
const int maxn=1e5+50;
const int N=50;
typedef long long ll;
typedef struct{
ll u,v,next,w;
}Edge;
Edge e[N];
int cnt,head[N];
inline void add(int u,int v){
e[cnt].u=u;
e[cnt].v=v;
//e[cnt].w=w;
// e[cnt].f=f;
e[cnt].next=head[u];
head[u]=cnt++;
// e[cnt].u=v;
// e[cnt].v=u;
// e[cnt].w=0;
// e[cnt].f=-f;
// e[cnt].next=head[v];
// head[v]=cnt++;
}
inline int read()
{
int x = 0;
int f = 1;
char c = getchar();
while (c<'0' || c>'9')
{
if (c == '-')
f = -1;
c = getchar();
}
while (c >= '0'&&c <= '9')
{
x = x * 10 + c - '0';
c = getchar();
}
return x*f;
}
int num=1,t,n,flag,trie[maxn][12];
string s[maxn];
bool com(string s1,string s2){
if(s1==s2){
flag=1;
}
return s1.length()>s2.length();
}
void insert(string s1){
int p=1;
for(int i=0;i<s1.length();i++){
int ch=s1[i]-'0';
if(!trie[p][ch])trie[p][ch]=++num;
p=trie[p][ch];
}
}
bool query(string s1){
int p=1;
for(int i=0;i<s1.length();i++){
int ch=s1[i]-'0';
if(!trie[p][ch])return 0;
p=trie[p][ch];
}
return 1;
}
int main() {
cin>>t;
while(t--){
cin>>n;
num=1,flag=0;
memset(trie,0,sizeof(trie));
for(int i=0;i<n;i++){
cin>>s[i];
}
sort(s,s+n,com);
if(flag==1){cout<<"NO"<<endl;}
else {
insert(s[0]);
flag=0;
for(int i=1;i<n;i++){
if(query(s[i])){
flag=1;
break;
}
insert(s[i]);
}
}
if(!flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
(仅供个人理解)