题目链接:zoj_2876 Phone List
本题是要考察一个电话号码是否是另一个号码的前缀。因为数据量大,如果逐一 比较会超时。
对于超时问题,一般考虑两个因素:
1.算法过于低效
2.时间开销在频繁的输入输出上
Tip1:由于这里判断的是前缀,所以只需将所有电话号码从小到大排列,对于每个号码,前面的都不是后面的前缀,那么这组测试案例就符合要求。
Tip2:为了减少时间开销,可采用scanf和printf进行输入输出,记得要include<cstdio>
代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
vector<string> v;
char ch[10];
string s;
int n;
int i,j;
cin>>n;
while(cin>>n)
{
v.clear();
for(i=0;i<n;i++)
{
scanf("%s",&ch);//切记这里第二个参数前的&,是从ch的地址读入字符
s=ch;
v.push_back(s);
}
sort(v.begin(),v.end());
for(i=0;i<n-1;i++)
{
if(v[i+1].find(v[i])==0)//判断前一个号码是否是后一个的前缀
{
printf("NO\n");
goto RL;
}
}
printf("YES\n");
RL:continue;//继续while循环
}
}