先放题吧...
可重叠子串 (Ver. I)
题目描述
给定一个字符串(模式串)和一些待查找的字符串,求每个待查找字符串在模式串中出现的次数(可重叠)
输入
测试数据有多组(测试组数 <= 5),
第一行包括一个字符串P,长度不超过105,且非空串
第二行包括一个整数N,代表待查找的字符串数量 (1 <= N <= 5)
接下来的N行,每一行包括一个待查找的字符串,其长度不超过50,且非空串
输出
对于每组测试数据,
输出每个待查找字符串出现的次数,
具体输出见样例
样例输入
aabbcc
3
aa
bb
cc
ababab
1
aba
样例输出
aa:1
bb:1
cc:1
aba:2
按照大佬们的意思这是KMP算法的模板题...今天下午之前我连什么是KMP都还不知道...啃了一下午的KMP。
这个大佬有关KMP算法的博客写得非常好:http://www.cnblogs.com/SYCstudio/p/7194315.html(我这个菜鸡看了好久才弄懂)
然后我的代码也还是有直接抄大佬的(等我之后重新做再更新完全是自己写的吧(捂脸))。
代码如下:
#include <iostream>
#include <cstring>
using namespace std;
int Next[1001];
void get_Next(string patten)
{
memset(Next,-1,sizeof(Next));
for(int i=1;i<(int)patten.length();i++){
int j=Next[i-1];
while((patten[j+1]!=patten[i]) && (j>=0))
j=Next[j];
if(patten[j+1]==patten[i])
Next[i]=j+1;
}
}
int KMP_getcount(string target,string patten)
{
int n=target.length();
int m=patten.length();
get_Next(patten);
int count=0;
int i=0,j=0;
while(i<n){
if(target[i]==patten[j]){
i++;
j++;
if(j==m){
count++;
j=Next[j-1]+1;
}
}
else{
if(j==0)
i++;
else
j=Next[j-1]+1;
}
}
return count;
}
int main()
{
string target;
string patten;
while(cin>>target){
int n;
cin>>n;
while(n--){
cin>>patten;
int count=KMP_getcount(target,patten);
cout<<patten<<":"<<count<<endl;
}
}
return 0;
}
大佬们轻喷。