POJ 3461 Oulipo(字符串匹配,KMP算法)
题意:给出几组数据,每组有字符串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算法)的更多相关文章
- 字符串匹配KMP算法详解
1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有比较详细的通俗易懂的讲解,另一方面也怪自己没有沉下心来研究.最近在leetcode上又遇见字符串匹配的题目,以此 ...
- poj 3461 字符串单串匹配--KMP或者字符串HASH
http://poj.org/problem?id=3461 先来一发KMP算法: #include <cstdio> #include <cstring> #include ...
- 字符串匹配KMP算法
1. 字符串匹配的KMP算法 2. KMP算法详解 3. 从头到尾彻底理解KMP
- 字符串匹配--kmp算法原理整理
kmp算法原理:求出P0···Pi的最大相同前后缀长度k: 字符串匹配是计算机的基本任务之一.举例,字符串"BBC ABCDAB ABCDABCDABDE",里面是否包含另一个字符 ...
- 字符串匹配KMP算法的C语言实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
- 字符串匹配KMP算法的讲解C++
转自http://blog.csdn.net/starstar1992/article/details/54913261 也可以参考http://blog.csdn.net/liu940204/art ...
- 字符串匹配KMP算法(转自阮一峰)
转自 http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html 字符串匹配是计算 ...
- 【Luogu P3375】字符串匹配KMP算法模板
Luogu P3375 模式串:即题目中的S2所代表的意义 文本串:即题目中的S1所代表的意义 对于字符串匹配,有一种很显然的朴素算法:在S1中枚举起点一位一位匹配,失配之后起点往后移动一位,从头开始 ...
- 字符串匹配——KMP算法
关于KMP算法的分析,我觉得这两篇博客写的不错: http://www.ruanyifeng.com/blog/2013/05/Knuth–Morris–Pratt_algorithm.html ht ...
随机推荐
- centos6.5安装flume
这里安装flume是因为游戏业务日志搜集和分析用的 1.安装java 环境rpm -ivh jdk-8u51-linux-x64.rpm Preparing... ################## ...
- .NET SOCKET通信编程
1 using System; 2 using System.Net; 3 using System.Net.Sockets; 4 using System.Text; 5 6 public clas ...
- linux gd库不支持jpeg解决办法
1. 查看gd库是否支持jpeg gd_info(); 2. 如果JPEG Support 不为1则不支持. 3.首先下载 libjpeg http://www.ijg.org/ ,进行安装 安装目录 ...
- 重拾C,一天一点点
数据类型及长度 char 字符型,占用一个字节 int 整型,通常代表特定机器中整数的自然长度 short 16位 int 16位或32位 ...
- KBase使用教程
1. SELECT * FROM EXPERT_BASEINFO WHERE (源照片='*' not 源照片 is null) and 标准一级机构='山东大学' and 当前职称='*教授' 2. ...
- line-height属性使文字垂直居中原理
原理:line-height与font-size的计算之差(在CSS中成为“行间距”)分为两半,分别加到一个文本内容的顶部和底部,这样就使得文字垂直居中了.
- opencv的初体验
http://guoming.me/opencv-config 这篇文章有讲解opencv的安装与配置 一些常用库 opencv_core249d.lib opencv_imgproc249d.li ...
- wpf MVVM ViewModel 关闭View显示
上次说到了不同wpf窗体之间的交互,这个在MVVM模式之中用起来会方便很多 下面我来说下在ViewModel中关闭View的方法,其实也很简单的,注释照样不写,一看就懂的 public partial ...
- Linux使用标准IO的调用函数,分3种形式实现
/*根据cp命令的格式要求,设计一个类cp的功能程序,要求使用标准IO的调用函数,分3种形式实现,字符,行,块.并注意函数功能的分层*/ #include<stdio.h> #includ ...
- 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 ...