题目大意

给定两个字符串S1, S2,求S1中包含多少个S2串。其中S1长度最大为 1000000, S2长度最大为10000。

题目分析

典型的字符串匹配问题,直接匹配显然会超时,考虑使用kmp算法。 
需要注意的是,尽量减少求串长度的strlen的执行次数。

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#define MAX_WORD_LEN 10005
#define MAX_TEXT_LEN 1000005
#include<stdio.h>
#include<string.h> char gWord[MAX_WORD_LEN];
char gText[MAX_TEXT_LEN];
int gNext[MAX_WORD_LEN];
void GenerateNext(const char* sub_str, int* next, int len){
next[0] = 0; //next[i]表示sub_str[0, i]中最长相同前后缀的长度
for (int i = 1; i < len; i++){
int j = next[i - 1];
while (sub_str[j] != sub_str[i]){ //不断回溯,每次利用next数组来确定下一个需要判断的位置
if (j == 0){
j = -1;
break;
}
j = next[j - 1];
}
if (j < 0)
next[i] = 0;
else
next[i] = j + 1;
}
} //返回母串中有多少个子串
int Kmp(char* mas_str, const char* sub_str, int* next, int len){
int count = 0;
char* pos = mas_str; //母串中当前检查的位置
int i = 0; //子串中当前检查的位置
char* end = mas_str + strlen(mas_str);
while (pos + len - i <= end){
while (i < len && *(pos + i) == sub_str[i]){
i++;
}
if (i == len){
count++;
}
if (i == 0){ //i == 0时,没有next[i-1],单独处理
pos++;
}
else{
pos += (i - next[i - 1]); //利用next数组进行更新
i = next[i - 1];
}
}
return count;
} int main(){
int cas;
scanf("%d", &cas);
getchar();
for (int i = 0; i < cas; i++){
scanf("%s", gWord);
scanf("%s", gText);
int len = strlen(gWord);
GenerateNext(gWord, gNext, len);
int count = Kmp(gText, gWord, gNext, len);
printf("%d\n", count);
}
return 0;
}

poj_3461 kmp的更多相关文章

  1. poj_3461 KMP算法解析

    A - Oulipo Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  2. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  3. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  4. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  5. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  6. [KMP]【学习笔记】

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Descript ...

  7. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

  8. KMP专题

    1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1 ...

  9. KMP学习之旅

    说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...

随机推荐

  1. 【Unity笔记】摄像机跟随目标角色

    public class CameraFollow : MonoBehaviour { public Transform target; // The position that that camer ...

  2. linux内核阻塞IO

    阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被挂起的进程进入休眠状态,被从调度器的运行队列移走,知道等待的条件被满足.而非阻塞的进程在不能进行设备操作时, ...

  3. 【高可用HA】Nginx (1) —— Mac下配置Nginx Http负载均衡(Load Balancer)之101实例

    [高可用HA]Nginx (1) -- Mac下配置Nginx Http负载均衡(Load Balancer)之101实例 nginx版本: nginx-1.9.8 参考来源: nginx.org [ ...

  4. window上将MongoDB的启动加入到服务中

    在系统管理员的命令行模式中: 进入mongo的安装目录,参照如下: 其中: --dbpath为保存的数据的路径 mongod --bind_ip --serviceName "MongoDB ...

  5. sublime text2 配置

    2.使用Package Control组件安装 也可以安装package control组件,然后直接在线安装: 按Ctrl+`调出console 粘贴以下代码到底部命令行并回车:import url ...

  6. 关于Cocos2d-x中GameController的定义

    GameController类是继承自Scheduler(有计时功能)或者Ref(可自动释放)的用户自己定义的一个控制器 如果一个场景有多个层的话,要用GameController,一个GameCon ...

  7. 关于Cocos2d-x头文件的引用

    cocos2d-x 3.10的G:\cocoshome\Cocos2d-x\cocos2d-x-3.10\extensions\GUI\CCControlExtension\CCScale9Sprit ...

  8. Python RGB 和HSV颜色相互转换

    转自:http://outofmemory.cn/code-snippet/1002/Python-RGB-HSV-color-together-switch Python RGB 和HSV颜色相互转 ...

  9. Intellij IDEA Module 的Language Level的问题

    最近从github上fork了张开涛的Shiro代码,IDE是Intellij IDEA.发现无论是Project还是Module,默认的Language Level都是JDK 1.5,而且每次修改都 ...

  10. 第三百一十二节,Django框架,Cookie

    第三百一十二节,Django框架,Cookie 注意:获取Cookie是在请求对象里处理,设置Cookie是在响应对象里处理 普通Cookieset_cookie()设置普通cookie 参数: ke ...