题目描述
We know that if a phone number A is another phone number B’s prefix, B
is not able to be called. For an example, A is 123 while B is 12345, after pressing 123, we call A, and not able to call B.
Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
Given N phone numbers, your task is to find whether there exits two numbers A and B that A is B’s prefix.
输入
The input consists of several test cases.
The first line of input in each test case contains one integer N (0<N<1001), represent the number of phone numbers.
The next line contains N integers, describing the phone numbers.
The last case is followed by a line containing one zero.
The first line of input in each test case contains one integer N (0<N<1001), represent the number of phone numbers.
The next line contains N integers, describing the phone numbers.
The last case is followed by a line containing one zero.
输出
For each test case, if there exits a phone number that cannot be called, print “NO”, otherwise print “YES”
instead.
示例输入
2 012 012345 2 12 012345 0
示例输出
NO YES
只要有一个串是另一个串的前缀,就输出NO然后结束。否则输出YES
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int cmp(const void*a,const void*b)
{
char *A=(char*)a;
char *B=(char*)b;
return strlen(A)-strlen(B);
}
int main()
{
int N;
while(cin>>N&&N!=0)
{
char num[1010][100];
for(int i=0;i<N;i++)
cin>>num[i];
qsort(num,N,sizeof(num[0]),cmp);
int flag=0;
for(int i=0;i<N;i++)
{
flag=0;
for(int j=i+1;j<N;j++)
{
char *c=strstr(num[j],num[i]);
if(num[i][0]==num[j][0]&&c==&num[j][0])
{
cout<<"NO"<<endl;
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==0)
cout<<"YES"<<endl;
}
return 0;
}