題目分析:
這道題也就是給定電話號碼,然後看較短的號碼是不是較長的號碼的前綴,如果是的話就輸出NO,否則就輸出YES。首先,作為一個二逼青年,我第一時間想到的肯定是把所有的電話號碼排序,這樣只可能前一個字符串是後一個字符串的前綴了。當然還可以進行減枝,如果兩個字符串的第一個字符不等,或者前一個字符串的長度比後一個字符串的長度長。如果是前綴的話,長度肯定是小於等於撒~
先給出二逼的解法,稍後給出文藝點的解法。OK,文藝青年來襲~~
[cpp]
#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;
}