http://acm.hdu.edu.cn/showproblem.php?pid=5763
题目的意思是,给两个字符串a,b,其中b串有两种意思,如果b是a的子串问a串表达几种意思,其中的“*hehe”的 *号表示的是b串 。
思路:我在比赛的时候做的时候,知道用KMP,但是呢,不知道中间的该怎么办,我就试着需找规律,但是规律我找的还是错的,后来,比赛结束后就看的题解,理解后,自己打出来的,但是呢,因为代码量的问题,打这个代码,也花了好长时间,天啊,好心酸啊
下面是我写的代码
#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int N=100010;
const int mod=1000000007;
string a,b;
int y;
__int64 dp[N];
int l,ans=1;
int nexts[N];
void get_fail(string p)
{
memset(nexts,0,sizeof(nexts));
int len=p.size();
nexts[0]=nexts[1]=0;
for(int i=1; i<len; i++)
{
int j=nexts[i];
while(j&&p[i]!=p[j])
j=nexts[j];
nexts[i+1]=p[i]==p[j]?j+1:0;
}
}
void kmp_find_pos(string T,string p)
{
int len_t=T.size();
int len_p=p.size();
get_fail(p);
int j=0;
int b1=len_p;
int cnt=0;
int u,i;
for(i=0; i<len_t; i++)
{
while(j&&p[j]!=T[i])
j=nexts[j];
if(p[j]==T[i])
j++;
if(j==len_p)
{
cnt++;
if(cnt==1)
{
dp[i]=dp[i-1]+1;
}
else
{
dp[i]=(dp[i-1]+dp[i-b1])%mod;
}
}
else
{
dp[i]=dp[i-1];
}
}
if(cnt==0)
printf("Case #%d: 1\n",ans++);
else
printf("Case #%d: %I64d\n",ans++,dp[len_t-1]%mod);
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
cin>>a>>b;
y=a.size();
for(int i=-1; i<=y; i++)
{
dp[i]=1;
}
get_fail(b);
kmp_find_pos(a,b);
}
return 0;
}

本文深入探讨了KMP算法的应用场景,特别是在处理字符串匹配问题时的高效解决方案。通过一个具体的编程实例,详细介绍了如何利用KMP算法解决特定类型的字符串匹配问题,并提供了完整的代码实现。

493

被折叠的 条评论
为什么被折叠?



