3620: 似乎在梦中见过的样子
Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 309 Solved: 170
[ Submit][ Status][ Discuss]
Description
Input
Output
Sample Input
aaaaa
1
【样例输入 2】
abcabcabc
2
Sample Output
6
【样例输出 2】
8
HINT
对于 100%的数据:n<=15000 , k<=100,且字符集为所有小写字母
解题思路:看一下数据发现15s的时间可用暴力,于是就枚举起点,并都做一次KMP,然后根据函数逐一判断结尾。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
int k,lent,len;
char c[20001]; char s[20001];
int f[16001];
void KMP()
{
f[0]=-1; f[1]=0;
for (int i=1;i<=len;++i)
{
int j=f[i-1];
while (j!=-1 && s[j]!=s[i-1])
{
j=f[j];
}
if (j==-1) f[i]=0;else
f[i]=j+1;
}
}
int main()
{
scanf("%s",c); scanf("%d",&k); lent=strlen(c);
int sum=0;
for (int i=1;i<=lent;++i)
{
for (int j=0;j<=lent-i;++j)
{
s[j]=c[j+i-1];
}
len=lent-i+1;
KMP();
for (int j=1;j<=len;++j)
if (j>=2*k+1)
{
int now=j;
while (now!=0 && (f[now]*2>=j || f[now]<k))
now=f[now];
if (now!=0) ++sum;
}
}
cout<<sum;
}