Kolya got string s for his birthday, the string consists of small English letters. He immediately added k more characters to the right of the string.
Then Borya came and said that the new string contained a tandem repeat of length l as a substring. How large could l be?
See notes for definition of a tandem repeat.
The first line contains s (1 ≤ |s| ≤ 200). This string contains only small English letters. The second line contains number k (1 ≤ k ≤ 200) — the number of the added characters.
Print a single number — the maximum length of the tandem repeat that could have occurred in the new string.
aaba 2
6
aaabbbb 2
6
abracadabra 10
20
A tandem repeat of length 2n is string s, where for any position i (1 ≤ i ≤ n) the following condition fulfills: si = si + n.
In the first sample Kolya could obtain a string aabaab, in the second — aaabbbbbb, in the third — abracadabrabracadabra.
题意:在给定字符串后加任意长度为k的字符后,最长能形成多长的重复两次的字符串。
思路:用哈希是n方复杂度,其实n的三次方也可以过。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int M=100007,Hash[210],F[210];
char s[210];
bool solve(int a,int b,int c,int d)
{ return Hash[d]-Hash[c-1]*F[d-c+1]==Hash[b]-Hash[a-1]*F[b-a+1];
}
int main()
{ int n,i,j,k,len,a,b,c,d,ans=0;
scanf("%s%d",s,&k);
len=strlen(s);
F[0]=1;
for(i=1;i<=len;i++)
{ Hash[i]=Hash[i-1]*M+s[i-1];
F[i]=F[i-1]*M;
}
for(i=1;i<=len+k;i++)
for(j=i;j<=len+k;j++)
{ a=i;b=j;c=j+1;d=2*j-i+1;
if(d>len+k)
break;
if(d<=len)
if(solve(a,b,c,d))
ans=max(ans,d-a+1);
else if(c<=len)
if(solve(a,a+len-c,c,len))
ans=max(ans,d-a+1);
else
ans=max(ans,d-a+1);
}
printf("%d\n",ans);
}