KMP模版 && KMP求子串在主串出现的次数模版
求取出现的次数 :
#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{
, j = -, len = strlen(mo);
next[i] = j;
while(i < len){
// if(j == -1 || mo[i] == mo[j]) next[++i] = ++j;
// else j = next[j];
&& mo[i] != mo[j]) j = next[j];
next[++i] = ++j;
}
}
int KmpCount()///计算模式串在子串出现的次数
{
GetNext();
, j = , strL = strlen(str), moL = strlen(mo);
;
while(i < strL){
&& mo[j] != str[i]) j = next[j];
i++, j++;
if(j == moL) ans++;
}
return ans;///返回模式串在主串中出现的次数(可重叠出现)
}
int main(void)
{
scanf("%s %s", str, mo);
printf("%d\n", KmpCount());
;
}
求模式串第一次在主串出现的位置 or 匹配是否在主串出现过 :
#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///mo为模式串、str为主串
int next[maxn];
inline void GetNext()
{
, j = -, len = strlen(mo);
next[i] = j;
while(i < len){
&& mo[i] != mo[j]) j = next[j];
next[++i] = ++j;
}
}
int KmpIndex()
{
GetNext();
, j = , strL = strlen(str), moL = strlen(mo);
while(i < strL && j < moL){
&& str[i] != mo[j]) j = next[j];
i++, j++;
}
if(j == moL) return i - moL;///返回模式串在主串中首次出现的位置
;
}
int main(void)
{
scanf("%s %s", str, mo);
printf("%d\n", KmpIndex());
;
}
///--------------------------------------------------------------------------------------------------------------------------
KMP算法的解释尤其是next数组可以参考这个博客 : http://blog.csdn.net/yutianzuijin/article/details/11954939/
这个是我对KMP的next数组的一点理解,都写在注释里面了
#include<bits/stdc++.h>
;
char mo[maxn], str[maxn];///分别为模式串和子串
int next[maxn];
/// next[i] 可以"翻译"成 i 这里失配了,考虑 0~(i-1) 这个
/// 串,看能否找到一个位置 k 和 k' 使得前缀 0~k 和后缀
/// k'~(i-1)一样,而next[i]存储的就是 k+1 这个位置,即
/// 前缀的前一个
inline void GetNext()
{
, j = -, len = strlen(mo);
next[i] = j;
while(i < len){
&& mo[i] != mo[j]) j = next[j];
next[++i] = ++j;
}
}
///-------------------------------------------------------------
///可以用下面的图来动态演示一下GetNext()的步骤,可能就能够理解
// i
//- 0 1 2 3 4 5 6 7 8
// a b c a b c a d x
// - 0 0 0 1 2 3 4 0
// a b c a b c a d x
// - 0 0 0 1 2 3 4 0
// j
///下面有几句话可能能帮助理解
///①找next的值相当于就是拿模式串自己和自己匹配,在下面移动的就是后缀,在上面的就是前缀
///②当前匹配的字符以及其前面的字符的next值肯定是已经求出来的
///③当j==-1的时候就说明现在的i连模式串的第一个都不能匹配到
///④如果是判断当前的 i 和 j 则说明是在为 i+1 这个字符寻找 0~i (即i+1后的字符串)是否拥有相同前后缀
///--------------------------------------------------------------
int KmpCount()
{
GetNext();
, j = , strL = strlen(str), moL = strlen(mo);
;
while(i < strL){
&& mo[j] != str[i]) j = next[j];///匹配的时候当 j == -1 的时候就已经是第
i++, j++; ///一个现在的主串 i 连模式串的第一个都不
if(j == moL) ans++; ///能匹配,所以下面让 i++,因为 j == -1,
} ///所以 j++ 后自然是子串第一个
return ans;
}
KMP模版 && KMP求子串在主串出现的次数模版的更多相关文章
- KMP小扩展,找出子串在主串中出现的所有位置
KMP算法能够高效地匹配字符串,找出子串(T串)在主串(S串)中出现的首个位置的原算法网上已经有很多优秀的博文进行详细讲解,这里就不多赘述. 这篇博文主要是对KMP原算法稍作改动,使其能够在主串中把所 ...
- POJ-3461 Oulipo(KMP,模式串在主串中出现次数)
题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...
- POJ 3461 Oulipo(KMP,模式串在主串中出现次数 可重叠)
题意:给你两个字符串p和s,求出p在s中出现的次数. 显然,我们要先把模式串放到前面,之后主串放后面,中间隔开,这样就可以根据前缀数组的性质来求了. 我先想直接把p接到s前面,之后求Next数组对st ...
- POJ 3461 Oulipo(模式串在主串中出现次数 可重叠)
Oulipo [题目链接]Oulipo [题目类型]KMP &题意: 给你两个字符串p和s,求出p在s中出现的次数. &题解: kmpC函数就是解题的,其中也就j=nex[j]难理解一 ...
- JAVA常见算法题(三十三)---求子串在字符串中出现的次数
计算某字符串中子串出现的次数. public static void main(String[] args) { String s1 = "adcdcjncdfbcdcdcd"; ...
- C#查找子串在原串中出现次数
提供的是一种思路,和具体语言无关. string test = "good good study day day up"; string r = test.Replace(&quo ...
- 串的模式匹配算法(求子串位置的定位函数Index(S,T,pos))
串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j ...
- Blue Jeans---poj3080(kmp+暴力求子串)
题目链接:http://poj.org/problem?id=3080 题意就是求n个长度为60的串中求最长公共子序列(长度>=3):如果有多个输出字典序最小的: 我们可以暴力求出第一个串的所有 ...
- HDU 1686 Oulipo【kmp求子串出现的次数】
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
随机推荐
- 吉首大学2019年程序设计竞赛(重现赛)-J(树形DP)
题目链接:https://ac.nowcoder.com/acm/contest/992/J 题意:题意很清晰,就是求任意两点距离的和,结果对1e9+7取模. 思路:裸的树形DP题,一条边的贡献值=这 ...
- redis缓存穿透00
缓存穿透 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果数据库 ...
- Python之模块IO
目录 Python之模块IO io概叙 io类层次结构 io模块的类图 io模块的3种I/O 原始I/O,即RawIOBase及其子类 文本I/O,即TextIOBase及其子类 字节I/O(缓存I/ ...
- nginx配置:静态访问txt文件
有一个A网站,访问的话会重定向跳转到B网站上,在A网站的nginx配置文件中配置的有如下: location / { rewrite ^/(.*) http://B/$1 redirect; } 现在 ...
- 分布式的几件小事(四)dubbo负载均衡策略和集群容错策略
1.dubbo负载均衡策略 ①random loadbalance 策略 默认情况下,dubbo是random loadbalance 随机调用实现负载均衡,可以对provider不同实例设置不同的权 ...
- Visual Studio (VC) Win32 程序由于数据大,内存溢出怎么办?
Visual Studio (VC) 内编写的Win32 程序由于数据大,内存溢出,即使转移到64位系统也不行.在国外网站上找到了答案. 原来,只需在project->property中的Lin ...
- 转载:elasticsearch入门篇
转自:https://www.cnblogs.com/hello-shf/p/11543408.html elasticsearch入门篇 elasticsearch专栏:https://www. ...
- subversion(SVN)服务配置及使用方法
1.安装 yum install httpd httpd-devel subversion mod_dav_svn mod_auth_mysql -y 2.查看版本 svnserve --vers ...
- 2019-11-29-asp-dotnet-core-通过图片统计-csdn-用户访问
title author date CreateTime categories asp dotnet core 通过图片统计 csdn 用户访问 lindexi 2019-11-29 08:26:58 ...
- Delphi 监视数据的值