poj 3461 字符串单串匹配--KMP或者字符串HASH
http://poj.org/problem?id=3461
先来一发KMP算法:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdin) const int MAXN = 1000000+100;
char T[MAXN],P[MAXN],tmp[MAXN];//T--文本,P--模板串
int fail[MAXN];
void getfail()
{
int m=strlen(P);
fail[0]=fail[1]=0;
for(int i=1;i<m;i++)
{
int j=fail[i];
while(j && P[i]!=P[j])j=fail[j];
fail[i+1]=P[i]==P[j]?j+1:0;
}
} int Find()
{
int ans=0;
int n=strlen(T),m=strlen(P);
if(n<m)
{
strcpy(tmp,T);
strcpy(T,P);
strcpy(P,tmp);
}
getfail();
int j=0;
for(int i=0;i<n;i++)
{
while(j && P[j]!=T[i])j=fail[j];
if(P[j] == T[i])j++;
if(j==m)//printf("%d\n",i-m+1);//find it
ans++;
}
return ans;
} int main()
{
//IN("poj3461.txt");
int n;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%s%s",P,T);
printf("%d\n",Find());
} }
return 0;
}
再来一发字符串HASH
我的字符串HASH模板在http://blog.csdn.net/u011026968/article/details/38460357
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <queue>
using namespace std; #define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdin)
#define ull unsigned long long
const ull B = 1e8+7; /*according to the book*/
const int MAXN = 1000000+100;
char a[MAXN],b[MAXN],tmp[MAXN]; int hashfind()
{
int ans=0;
int al=strlen(a),bl=strlen(b);
if(al>bl)
{
strcpy(tmp,a);
strcpy(a,b);
strcpy(b,tmp);
}
ull t=1,ah=0,bh=0;
for(int i=0;i<al;i++)
{
t*=B;
ah=ah*B+a[i];
bh=bh*B+b[i];
}
for(int i=0;i+al<=bl;i++)
{
if(ah==bh)ans++;
if(i+al<bl)bh=bh*B+b[i+al]-b[i]*t;
}
return ans;
} int main()
{
//IN("poj3461.txt");
int n;
while(~scanf("%d",&n))
{
while(n--)
{
scanf("%s%s",a,b);
printf("%d\n",hashfind());
} }
return 0;
}
poj 3461 字符串单串匹配--KMP或者字符串HASH的更多相关文章
- POJ 3461 Oulipo(字符串匹配,KMP算法)
题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...
- HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP)
HDU 1686 Oulipo / POJ 3461 Oulipo / SCU 2652 Oulipo (字符串匹配,KMP) Description The French author George ...
- 【kmp】 字符串最大周期
大侠住店 TimeLimit: 1 Second MemoryLimit: 32 Megabyte Totalsubmit: 116 Accepted: 64 Description 有一天晚上,一位 ...
- POJ - 3461 (kmp)
题目链接:http://poj.org/problem?id=3461 Oulipo Time Limit: 1000MS Memory Limit: 65536K Total Submissio ...
- 字符串匹配算法之 kmp算法 (python版)
字符串匹配算法之 kmp算法 (python版) 1.什么是KMP算法 KMP是三位大牛:D.E.Knuth.J.H.MorriT和V.R.Pratt同时发现的.其中第一位就是<计算机程序设计艺 ...
- Python 细聊从暴力(BF)字符串匹配算法到 KMP 算法之间的精妙变化
1. 字符串匹配算法 所谓字符串匹配算法,简单地说就是在一个目标字符串中查找是否存在另一个模式字符串.如在字符串 "ABCDEFG" 中查找是否存在 "EF" ...
- KMP求字符串最小循环节
证明1: 对于一个字符串S,长度为L,如果由长度为len的字符串s(字符串s的最小循环节是其本身)循环k次构成,那么字符串s就是字符串S的最小循环节 那么字符串有个很重要的性质和KMP挂钩,即 i ...
- 统一修改表单参数(表单提交的空字符串统一转null)
统一修改表单参数(表单提交的空字符串统一转null) 1.介绍: 我们业务中有时会遇到提交的表单中某个参数为空字符串,导致后台接受的为空字符串("")而不是我们理想中的null,会 ...
- 数据结构学习之字符串匹配算法(BF||KMP)
数据结构学习之字符串匹配算法(BF||KMP) 0x1 实验目的 通过实验深入了解字符串常用的匹配算法(BF暴力匹配.KMP.优化KMP算法)思想. 0x2 实验要求 编写出BF暴力匹配.KM ...
随机推荐
- C# 自己用到的几个参数转换方法
/// <summary> /// Method:CommandHelper /// Author:Liuyangyi /// Data:2016-05-10 /// </summa ...
- Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
一. 问题出现原因 我们在做APP分享时,分享webview加载带有音乐播放控件的网页.当弹出分享界面,webview的网页处于后台状态或关闭该网页时,音乐声仍在播放.出现该类现象使我 ...
- Quartz中时间参数说明 即Cron表达式
Cron表达式 Quartz使用类似于Linux下的Cron表达式定义时间规则,Cron表达式由6或7个由空格分隔的时间字段组成,如表1所示: 表1 Cron表达式时间字段 位置 时间域名 允许值 允 ...
- x264
x264 x264 h264 1. x264调用主要过程 x264_param_default():设置参数集结构体x264_param_t的缺省值. x264_picture_alloc():为 ...
- 六时出行 App iOS隐私政策
本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐私权政策另 ...
- 四次挥手与tcp标志位
鉴于tcp的标志位可以同时置位,在相应端无数据传输时,四次握手可以用三次报文完成.
- C#斐波那契数列方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- strcmp 与 _tcscmp
strcmp 用来比较ANSI字符串,而_tcscmp用来比较UNICODE(宽字符)的字符串.ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束.而在UNIC ...
- 解决windows64位系统上安装mysql-python报错
解决windows64位系统上安装mysql-python报错 2018年03月12日 13:08:24 一个CD包 阅读数:1231 版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...
- c++ map迭代器
#include <stdio.h> #include <map> using namespace std; int main(){ map<int, int> m ...