题意:找出给出的n个串中的最长的公共字串,输出其长度。
分析:这道题比较水,KMP,string,strstr应该是都能过的,暴力就行。
wa的原因:这题比较颠覆我的世界观,一模一样的代码,scanf无限TLE,全改成cin AC。不理解是为什么,求大牛指点。
AC的代码:
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
char str[100][150];
int fail[150];
/*int kmp(char* str,char* pat){
int i,j,k;
memset(fail,-1,sizeof(fail));
for(i=1;pat[i];++i){
for(k=fail[i-1];k>=0&&pat[i]!=pat[k+1];k=fail[k]);
if(pat[k+1]==pat[i])fail[i]=k+11;
}
i=j=0;
while(str[i]&&pat[j]){
if(pat[j]==str[i])++i,++j;
else if(j==0)++i;
else j=fail[j-1]+1;
}
if(pat[j])return -1;
else return i-j;
}*/
int main(){
int t;
while (cin>>t){
while(t--){
int n;
//scanf("%d",&n);
cin>>n;
int len=150,min=150;
char str0[110];
int tex;
for(int i=0;i<n;++i){
// scanf("%s",str[i]);
cin>>str[i];
len=strlen(str[i]);
if(len<min){
min=len;
// memset(str0,0,sizeof(str0));
strcpy(str0,str[i]);
tex=i;
}
}
if(n==1){
cout<<strlen(str[0])<<endl;
continue;
}
int k=strlen(str0);
for(int j=k;j>=0;--j){
int flag=0;
for(int m=0;m<=k-j;++m){
char tem[150];
memset(tem,0,sizeof(tem));
int s,t;
for(s=0,t=m;s<j;++t,++s)tem[s]=str0[t];
//str0[t]='\0';
flag=0;
char temp[150];
strcpy(temp,tem);
reverse(tem,tem+j);
for(int i=0;i<n;++i){
if(!strstr(str[i],tem)&&!strstr(str[i],temp)&&i!=tex){flag=1;break;}
}
if(flag==0){cout<<j<<endl;break;}
}
if(flag==0)break;
}
}
}
return 0;
}
一道使用字符串处理算法解决的问题,通过KMP、string或strstr找到n个字符串中的最长公共子串,注意输入处理方式可能影响程序运行效率。
1万+

被折叠的 条评论
为什么被折叠?



