poj1226(字符串)

来源:互联网 发布:德里苏丹国 知乎 编辑:程序博客网 时间:2024/06/05 18:00

题意:找出给出的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;}