链接 M - Corporate Identity
这一道题的思路kmp暴力 但是还是要小心时间会超时
中间有一种kmp代码不知道为什么会错。。。。我太菜了,求大佬指正哇
被注释的那一段。
#include <map>
#include <set>
#include <list>
#include <queue>
#include <deque>
#include <cmath>
#include <stack>
#include <vector>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
char a[4005][205];
int f[205],exf[205];
void fc(char *p,int l)
{
int i=0;
int j=-1;
f[0]=-1;
while(i<l)
{
while(j==-1||p[i]==p[j])
{
f[++i]=++j;
}
if(p[i]!=p[j])
{
j=f[j];
}
}
}
bool kmp(char *p,int l1,char *q,int l2 )
{
int j=0;
int i=0;
while(i<l2)
{
if(j==-1||q[i]==p[j])
{
++i;
++j;
}
else
{
j=f[j];
}
if(j==l1)
{
return true;
}
}
return false;
//
// int j=-1;//会wa原因是我不知道求大佬评论区解答一下哇
// for(int w=0;w<l2;w++)
// {
// if(q[w]==p[j+1])
// {
// j++;
// }
// while(j>-1&&q[w]!=p[j+1])
// {
// j=f[j];
// }
// if(j+1==l1)
// {
// return true;
// }
// }
// return false;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n!=0)
{
int lmin=405;
char ans[205];
char sum[205];
int alllen[4005];
memset(ans,'\0',sizeof(ans));
memset(sum,'\0',sizeof(sum));
int lsum=0;
int lll;
for(int i=0;i<n;i++)
{
scanf("%s",a[i]);
alllen[i]=strlen(a[i]);
if(lmin>alllen[i])
{
lmin=alllen[i];
lll=i;
}
}
for(int i=0;i<lmin;i++)
{
ans[i]=a[lll][i];
}
for(int i=0;i<lmin;i++)
{
for(int j=1;i+j<=lmin;j++)
{
char attempt[205];
memset(attempt,'\0',sizeof(attempt));
for(int k=0;k<j;k++)
{
attempt[k]=ans[k+i];
}
int lattempt=strlen(attempt);
char *pp;
pp=attempt;
memset(f,-1,sizeof(f));
fc(pp,lattempt);
bool flag;
flag=false;
for(int k=0;k<n;k++)
{
char *qq;
qq=a[k];
pp=attempt;
if(!kmp(pp,lattempt,qq,alllen[k]))
{
flag=true;
break;//这里是关键解决超时
}
}
if(!flag)
{
lsum=strlen(sum);
if(lsum<lattempt)
{
memset(sum,'\0',sizeof(sum));
strcpy(sum,pp);
}
else if(lsum==lattempt&& strcmp(sum,pp)>0)
{
memset(sum,'\0',sizeof(sum));
strcpy(sum,pp);
}
}
}
}
if(lsum==0)
printf("IDENTITY LOST\n");
else printf("%s\n",sum);
memset(a,'\0',sizeof(a));
//memset(a,'\0',sizeof(a));
//memset(a,'\0',sizeof(a));
}
return 0;
}