题目链接:
思路:灵活运用kmp的next值,首先求kmp的next值,首先如果长度小于3那么肯定是不符合条件的,然后对2——len进行标记,然后求next[len+1],然后知道这个值出现过,说明中中间必然出现了前缀,那么就至少出现了3次了。。
题目:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<cmath>
#include<string>
#include<queue>
#define eps 1e-9
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1000000+10;
char p[maxn];
int m,vis[maxn],next[maxn];
void Getnext()
{
int j,k;
next[1]=0;
k=0;
j=1;
while(j<=m)
{
if(k==0||p[k]==p[j])
{
k++;
j++;
next[j]=k;
}
else
k=next[k];
}
}
int main()
{
int k,ans,i;
while(~scanf("%s",p+1))
{
m=strlen(p+1);
Getnext();
if(m<3)
{
printf("Just a legend\n");
continue;
}
memset(vis,false,sizeof(vis));
for(i=2;i<=m;i++)
vis[next[i]]=true;
i=next[m+1];
while(!vis[i]&&i) i=next[i];
if(i==1) printf("Just a legend\n");
else
{
for(int j=1;j<i;j++)
printf("%c",p[j]);
printf("\n");
}
}
return 0;
}
/*
fixafixbfix
ababacaba
acaba
qwertyqwertyqwerty
*/