题目:http://poj.org/problem?id=3630
题意很易懂,判断是否有电话号码是其他号码的前几位,关键在于不超时。
思路:按字典序排序后遍历判断是否有相邻两个号码短的是长的的前缀。
注:(1)string比较慢,考察超时的题尽量别用。
我就见过有同学用流读入然后超时的(手动滑稽)
语言:c风格的c++
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cstdlib>
using namespace std;
char s[10010][20];
int cmp(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
}
bool str_cmp(int a)
{
int len = min(strlen(s[a-1]), strlen(s[a]));
int i;
for(i=0;i<len;i++)
{
if(s[a-1][i]!=s[a][i])
return false;
}
return true;
}
int main()
{
int cases;
int i,j,k,len,n,t;
cin >> cases;
while(cases--)
{
cin >> n;
for(i=0;i<n;i++)
{
scanf("%s", s[i]);
}
qsort(s, n, sizeof(s[0]), cmp);
t = 0;
for(i=1;i<n;i++)
{
if(str_cmp(i))
{
t = 1;
break;
}
}
if(t==0)
{
puts("YES");
}
else
{
puts("NO");
}
}
return 0;
}