题意:给你一个主串,和一个子串,求主串中子串出现的次数
思路:暴力算的时间复杂度太大,所以用kmp,
PS:刚开始做的时候只会暴力,后面学了KMP,给和我一样还不会KMP的小伙伴推荐两篇博客:http://blog.csdn.net/yutianzuijin/article/details/11954939/
http://kb.cnblogs.com/page/176818/(推荐先看这个)
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int Next[1000010];
void kmp(char *s1) //搭建Next数组
{
int k = strlen(s1);
Next[1] = 0;
Next[0] = 0;
for(int i = 2;i<=k;i++)
{
int j = i-1;
Next[i] = 0;
while(j>0)
{
if(s1[Next[j]]==s1[i-1])
{
Next[i] = Next[j]+1;
break;
}
j = Next[j];
}
}
}
int main()
{
int n,a,b,l,r;
char str1[1000010],str2[1000010];
scanf("%d%d%d%d%d",&n,&a,&b,&l,&r);
scanf("%s",str1);
kmp(str1);
int w;
for(int i = 0;i<n;i++)
{
if(i==0)
w = b;
else
{
w = (w+a)%n;
}
if(w>=l&&w<=r)
{
if(w%2==0)
str2[i] = 'A';
else
str2[i] = 'T';
}
else
{
if(w%2==0)
str2[i] = 'G';
else
str2[i] = 'C';
}
}
int k = strlen(str1);
int j = 0,i = 0,ans = 0;
while(i<n)
{
while(j>0&&str2[i]!=str1[j])
j = Next[j];
if(str2[i]==str1[j])
j++;
if(j==k)
{
ans++;
j = Next[j];
}
i++;
}
printf("%d",ans);
return 0;
}