题意:给出几组数据,每组有字符串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. centos6.5安装flume

    这里安装flume是因为游戏业务日志搜集和分析用的 1.安装java 环境rpm -ivh jdk-8u51-linux-x64.rpm Preparing... ################## ...

  2. .NET SOCKET通信编程

    1 using System; 2 using System.Net; 3 using System.Net.Sockets; 4 using System.Text; 5 6 public clas ...

  3. linux gd库不支持jpeg解决办法

    1. 查看gd库是否支持jpeg gd_info(); 2. 如果JPEG Support 不为1则不支持. 3.首先下载 libjpeg http://www.ijg.org/ ,进行安装 安装目录 ...

  4. 重拾C,一天一点点

    数据类型及长度 char        字符型,占用一个字节 int          整型,通常代表特定机器中整数的自然长度 short       16位 int         16位或32位 ...

  5. KBase使用教程

    1. SELECT * FROM EXPERT_BASEINFO WHERE (源照片='*' not 源照片 is null) and 标准一级机构='山东大学' and 当前职称='*教授' 2. ...

  6. line-height属性使文字垂直居中原理

    原理:line-height与font-size的计算之差(在CSS中成为“行间距”)分为两半,分别加到一个文本内容的顶部和底部,这样就使得文字垂直居中了.

  7. opencv的初体验

    http://guoming.me/opencv-config  这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...

  8. wpf MVVM ViewModel 关闭View显示

    上次说到了不同wpf窗体之间的交互,这个在MVVM模式之中用起来会方便很多 下面我来说下在ViewModel中关闭View的方法,其实也很简单的,注释照样不写,一看就懂的 public partial ...

  9. Linux使用标准IO的调用函数,分3种形式实现

    /*根据cp命令的格式要求,设计一个类cp的功能程序,要求使用标准IO的调用函数,分3种形式实现,字符,行,块.并注意函数功能的分层*/ #include<stdio.h> #includ ...

  10. Using self-defined Parcelable objects during an Android AIDL RPC / IPC call

    Using self-defined Parcelable objects during an Android AIDL RPC / IPC call In my previous post “Usi ...