Kolya and Tandem Repeat - CF#253 (Div. 2)B (443B) 哈希或水题

B. Kolya and Tandem Repeat
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

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.

Input

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.

Output

Print a single number — the maximum length of the tandem repeat that could have occurred in the new string.

Sample test(s)
input
aaba
2
output
6
input
aaabbbb
2
output
6
input
abracadabra
10
output
20
Note

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);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值