题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次。

思路:字符串长度很大,用KMP算法。

  一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1。则接下来T的索引移动相应的距离,再调用函数判断T接下来的序列中是否存在W。

         如果不能匹配,则终止。

  结果,这样超时了。。。估计是调用函数上面花费了些时间。

  后来直接在函数中记录出现的个数,这样就不超时了。

#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std;
const int maxT=;
const int maxW=;
char w[maxW],t[maxT];
int suffix[maxW];//suffix[i]=k:表示P中前i个字符中,后缀与前缀间的最长匹配子串的长度。 void dealSuffix(int m){
memset(suffix,,sizeof(suffix));
suffix[]=-;
suffix[]=;
int k=;
for(int i=;i<=m;i++){
while(k>= && w[k]!=w[i-])
k=suffix[k];
suffix[i]=++k;
}
} //m为W字符串的长度
int match(int n,int m){
int i=,j=; //i为T中字符的下标,j为W中字符的下标
int cnt=; //统计W字符串在T字符串中出现的次数
while(i<=n-){
if(j<){
i++;
j=;
}
if(t[i]==w[j]){
i++;
j++;
}
else if(j>=){
j=suffix[j]; //当j=0的时候,suffix[0]=-1,这样j就会小于0,所以一开始有判断j是否小于0
} //W在T中找到匹配
if(j==m){
cnt++;
j=suffix[j];
}
}
return cnt;
}
int main()
{
int n,lw,lt;
scanf("%d",&n);
getchar(); //用gets的话,这里要写个getchar()
while(n--){
gets(w);
gets(t);
lw=strlen(w); //W字符串的长度
lt=strlen(t); //T字符串的长度
dealSuffix(lw);
int ans=match(lt,lw);
printf("%d\n",ans);
} return ;
}

下面是照搬算法导论上的代码:

#include <iostream>
#include <stdio.h>
#include <string.h> using namespace std;
const int maxT=;
const int maxW=;
char w[maxW],t[maxT];
int suffix[maxW];//suffix[i]=k:表示P中前i个字符中,后缀与前缀间的最长匹配子串的长度。 //m为w字符串的长度
void getSuffix(int m){
memset(suffix,,sizeof(suffix));
suffix[]=;
int k=;
for(int i=;i<=m;i++){
while(k> && w[k]!=w[i-])
k=suffix[k];
if(w[k]==w[i-])
k++;
suffix[i]=k;
}
}
//n为t字符串的长度,m为W字符串的长度
int match(int n,int m){
int k=,ans=;
for(int i=;i<n;i++){
while(k> && w[k]!=t[i])
k=suffix[k];
if(w[k]==t[i])
k++;
if(k==m){
ans++;
k=suffix[k];
}
}
return ans;
}
int main()
{
int n,lw,lt;
scanf("%d",&n);
getchar(); //用gets的话,这里要写个getchar()
while(n--){
gets(w);
gets(t);
lw=strlen(w); //W字符串的长度
lt=strlen(t); //T字符串的长度
getSuffix(lw);
int ans=match(lt,lw);
printf("%d\n",ans);
} return ;
}

POJ 3461 Oulipo(字符串匹配,KMP算法)的更多相关文章

  1. 字符串匹配KMP算法详解

    1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...

  2. poj 3461 字符串单串匹配--KMP或者字符串HASH

    http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...

  3. 字符串匹配KMP算法

    1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP

  4. 字符串匹配--kmp算法原理整理

    kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...

  5. 字符串匹配KMP算法的C语言实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  6. 字符串匹配KMP算法的讲解C++

    转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...

  7. 字符串匹配KMP算法(转自阮一峰)

    转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...

  8. 【Luogu P3375】字符串匹配KMP算法模板

    Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...

  9. 字符串匹配——KMP算法

    关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...

随机推荐

  1. Windows下安装GnuRadio最简单的方法(没有之一)

    作者在Windows XP SP3 32位下亲测通过,理论上Win7也没问题. 1. 如果系统中安装有Python,请先把Python卸载. 2. 下载安装Python(x,y) 2.7.5.0, 下 ...

  2. [视频]MAC中如何单独放大文本字体

    我们知道使用MAC触控板的双指合拢手势可以进行放大或缩小操作,但其对应的是整个界面内容的放大及缩小,如果仅对其文本内容进行放大或缩小,可使用快捷键进行操作. 默认的 ”Command” + “=“   ...

  3. PHP合并数组保留key值

    PHP合并数组,键值不变   尝试了好几个合并数组的函数, 但是都是把key值重置, 导致key值丢失(因为key值是要用到的) 大大说, 最好用数组的相关函数, 网上随意找了下, 还是没找到. 因为 ...

  4. TCP之Socket的编程

    Socket是网络编程的一个抽象的概念,通常我们用Socket来表示服务器与客户端间的网络连接, 即用Socket表示"打开了一个网络连接", 而打开一个网络连接需要知道目标电脑的 ...

  5. Ajax和JavaScript的区别

    javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript.Javascript是由网景公司开发的一种脚 ...

  6. JQuery 获取json数据$.getJSON方法的实例代码

    这篇文章介绍了JQuery 获取json数据$.getJSON方法的实例代码,有需要的朋友可以参考一下 前台: function SelectProject() { var a = new Array ...

  7. PHP获取当前日期或指定日期的所在月的第一天和最后一天

    <?php function getthemonth($date) { $firstday = date('Y-m-01', strtotime($date)); $lastday = date ...

  8. PHP安全之register_globals

    一.register_globals = Off 和 register_globals = On的区别 register_globals是php.ini里的一个配置,这个配置影响到php如何接收传递过 ...

  9. URL地址下载图片到本地

    package test.dao; import eh.base.dao.DoctorDAO; import eh.entity.base.Doctor; import junit.framework ...

  10. Java 线程池框架核心代码分析

    前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和资源消耗都是很高的.线程池应运而生,成为我们管理线程的利器.Java 通过Executor接口,提供了一种标准的方法将任务的提交过 ...