字符串匹配
参考资料
KMP 算法
int kmp(string s,string t)
{
int n=s.size(),m=t.size();
for(int i=1,j=0;i<m;i++)
{
while(j&&t[i]!=t[j])j=nxt[j-1];
if(t[i]==t[j])j++;
nxt[i]=j;
}
for(int i=0,j=0;i<n;i++)
{
while(j&&s[i]!=t[j])j=nxt[j-1];
if(s[i]==t[j])j++;
if(j==m)return i-m+1;
}
return -1;
}
Rabin–Karp 算法
详见 字符串哈希。
int RK(string s,string t)
{
int n=s.size(),m=t.size();
if(n<m)return -1;
ull h1=0,h2=0,p=Pow(base,m-1);
for(int i=0;i<m;i++)
{
h1=h1*base+s[i];
h2=h2*base+t[i];
}
s+='$';
for(int i=0;i<=n-m;i++)
{
if(h1==h2&&s.substr(i,m)==t)return i;
h1=(h1-s[i]*p)*base+s[i+m];
}
return -1;
}
例题
给定两个字符串 和 ,求出 在 中所有出现的位置,以及 next 数组。Code (1)
给定 组数据,每组包含一个长度为 的字符串 和一个长度为 的字符串 。
可以将 中任意与 相同的子串替换为 给定 组数据,每组包含一个长度为 的字符串 和一个长度为 的字符串 。 可以将 中任意与 相同的子串替换为 定义 表示在 范围内进行替换的方案数,分类讨论: 列出状态转移方程: 利用 KMP 算法 或 Rabin–Karp 算法(Hash)等字符串匹配算法,可以单次 判断 是否成立。*,求有多少种不同的替换方案。Solution
参考资料
题意简述
*,求有多少种不同的替换方案。解题思路
参考代码
KMP 算法
Rabin–Karp 算法