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 ...
随机推荐
- STL--vector(转载)
函数 表述 c.assign(beg,end) c.assign(n,elem) 将[beg; end)区间中的数据赋值给c. 将n个elem的拷贝赋值给c. c.at(idx) 传回索引idx所指的 ...
- (三)Qt语言国际化
Vs 2010+ Qt5 实现语言国际化 创建一个工程,cpp代码如下: 1.创建工程 #include "languageinternationalized.h" #includ ...
- IOS引导页拨动4张图片最后一张停三秒进入主页,页面推送
// // ViewController.m // // // Created by 张艳锋 on 15/8/26. // Copyright (c) 2015年 张艳锋. All rights ...
- C#工具介绍
VisualStudio是微软的官方提供的.NET开发工具. 除了VisualStudio外,还有一些开源的.NET开发IDE. MonoDevelop.SharpDevelop等. 开发未必需要使用 ...
- silverlight 画图InkPresenter
<UserControl x:Class="SilverlightTest.PolygonTest" xmlns="http://schemas.microsoft ...
- javascript 创建对象及对象原型链属性介绍
我们知道javascript里定义一个普通对象的方法,如: let obj = {}; obj.num = 1; obj.string = 'string'; obj.func = function( ...
- 用PHP判断客户端是否是手机
<?php function isMobile(){ $useragent = isset($_SERVER['HTTP_USER_AGENT'])? $_SERVER['HTTP_USER_A ...
- Oracle RAC 11gR2 修改本地及SCAN监听端口
昨天同事说有套RAC集群客户要求修改数据库的监听端口,在处理的过程中,发现网上的相关资料都不是很全面,所以整理了一下,希望给其他有需要的朋友提供一点有利的参考资料.具体操作过程如下: ...
- kruskal --- c++ (2)
#include <cstdio> #include <algorithm> using namespace std; struct aaa{ int l,r,w; bool ...
- nginx demo
server_names_hash_bucket_size 512;upstream node_app { server 127.0.0.1:3000; } server { listen 80; s ...