题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=163
题目分析:
这道题也就是给定电话号码,然后看较短的号码是不是较长的号码的前缀,如果是的话就输出NO,否则就输出YES。首先,作为一个二逼青年,我第一时间想到的肯定是把所有的电话号码排序,这样只可能前一个字符串是后一个字符串的前缀了。当然还可以进行减枝,如果两个字符串的第一个字符不等,或者前一个字符串的长度比后一个字符串的长度长。如果是前缀的话,长度肯定是小于等于撒~
先给出二逼的解法,稍后给出文艺点的解法。OK,文艺青年来袭~~
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int compare(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}
const int Len = 13;//电话号码最多就11位吧,加一个'\0';
char phone[100000][Len];
int main()
{
int t,i,n;
int nLen1,nLen2;
char *p1;
char *p2;
bool flag;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0; i < n; ++i)
scanf("%s", phone[i]);
flag = false;
qsort(phone, n, Len, compare);
for(i = 0; i < n - 1; ++i)
{
if(phone[i][0] != phone[i + 1][0])//第一位就不等
continue;
nLen1 = strlen(phone[i]);
nLen2 = strlen(phone[i + 1]);
if(nLen1 <= nLen2)//前一个的长度小于后一个
{
p1 = phone[i];
p2 = phone[i + 1];
while(*(++p1) == *(++p2)) ;//这个空循环看懂了么?
if(*p1 == '\0')
{
flag = true;
break;
}
}
}//end for
if(flag)
printf("NO\n");
else
printf("YES\n");
}
return 0;
}