poj 3450 Corporate Identity 枚举+kmp,话说这家伙给我一顿超时啊!!!!

来源:互联网 发布:asp网上报名系统源码 编辑:程序博客网 时间:2024/05/01 10:33
 
话说这道题我真是无限超时啊!!!超时了无数次,最后优化了一上午,发现3点,终于过了725ms!!!!!
#include<iostream>using namespace std;#define max 5010int next[205];void prekmp(char aa[]){int j=-1;next[0]=-1;int len=strlen(aa);for(int i=1;i<len;i++){while(j>=0&&aa[i]!=aa[j+1])j=next[j];if(aa[i]==aa[j+1])j++;next[i]=j;}}int kmp(char ss[],char a[]){int len=strlen(a);    int lens=strlen(ss);int j=-1;for(int i=0;i<len;i++){    while(j>=0&&ss[j+1]!=a[i])j=next[j];if(ss[j+1]==a[i])j++;if(j==lens-1)return 1;}return 0;}int main(){char a[max][250];char ta[max],tb[max];int t,n;char tc[max];while(scanf("%d",&n),n){int temp=1;int len=0x7FFFFFFF;for(int i=1;i<=n;i++){scanf("%s",a[i]);int tlen=strlen(a[i]);if(tlen<len)//选出最小的,优化1 {temp=i;len=tlen;}}int sign=0,sign1=0;int i;for( i=len;i>=1;i--){for(int k=0;k<200;k++)tc[k]='z';tc[200]='\0';for(int j=0;j+i-1<len;j++){int cou=0;for(int k=j;k<=j+i-1;k++)ta[cou++]=a[temp][k];ta[cou]='\0';cou=0;prekmp(ta);//这个我已开始放在kmp里了,发现很浪费时间啊,优化2 for(int k=1;k<=n;k++){if(k!=temp){if(kmp(ta,a[k]))    {    cou++;    }    else    break;//这个优化很重要啊 优化3 }}if(cou==n-2+1){sign=1;sign1=1;if(strcmp(ta,tc)<0)strcpy(tc,ta);}}if(sign==1){printf("%s\n",tc);break;}}if(sign1==0)printf("IDENTITY LOST\n");}return 0;} 

原创粉丝点击