Phone ListTime Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 25761 Accepted Submission(s): 8610 Problem Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let’s say the phone catalogue listed these numbers:
Input The first line of input gives a single integer, 1 <= t <= 40, the number of test cases. Each test case starts with n, the number of phone numbers, on a separate line, 1 <= n <= 10000. Then follows n lines with one unique phone number on each line. A phone number is a sequence of at most ten digits.
Output For each test case, output “YES” if the list is consistent, or “NO” otherwise.
Sample Input 2 3 911 97625999 91125426 5 113 12340 123440 12345 98346
Sample Output NO YES
Source 2008 “Insigma International Cup” Zhejiang Collegiate Programming Contest - Warm Up(3)
Recommend lcy | We have carefully selected several similar problems for you: 1247 1800 1677 1298 2846 |
题意:给定n个电话号码串,问这n个电话号码串中是否存在某一串是其它串的前缀,如果存在输出NO,否则YES。
思路:在建立字典树的时候判断一下当前串是不是其他串的前缀,或者其他串是不是它的前缀即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int trie[maxn][10],tot,vis[maxn];
int inst(char s[])
{
int len=strlen(s);
int root=0;
int flag=0;
for(int i=0;i<len;i++)
{
int id=s[i]-'0';
if(!trie[root][id])
{
trie[root][id]=++tot;
flag=1;
}
root=trie[root][id];
if(vis[root]) return 1;
}
vis[root]=1;
if(!flag) return 1;
return 0;
}
int main()
{
int t,n;
char s[10005];
scanf("%d",&t);
int flag;
while(t--)
{
flag=0,tot=0;
memset(trie,0,sizeof(trie));
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",s);
int ans=inst(s);
if(ans) flag=1;
}
if(flag) printf("NO\n");
else printf("YES\n");
}
}