字符串匹配—KMP 扩展KMP Manacher
kuangbin字符串专题传送门--http://acm.hust.edu.cn/vjudge/contest/view.action?cid=70325#overview
算法模板:
KMP:
const int MAXM=10010;
const int MAXN=1000010;
int a[MAXN],b[MAXM],Next[MAXM];
int n,m; void getNext(int b[],int Next[])
{
int j=0,k=-1;
Next[0]=-1;
while(j<m-1)
{
if(k==-1||b[j]==b[k]) //匹配
{
j++,k++;
Next[j]=k;
}
else
k=Next[k]; //不匹配
}
} int KMP(int a[],int b[])
{
int i=0,j=0;
getNext(b,Next);
while(i<n)
{
if(j==-1||a[i]==b[j])
i++,j++;
else
j=Next[j];
if(j==m)
return i-m+1;
}
return -1;
}
扩展KMP:
const int MAXN;
int Next[MAXN],extend[MAXN];
char a[MAXN],b[MAXN]; void getNext(char b[])
{
int i,len=strlen(b);
Next[0]=len;
for(i=0;i<len-1&&b[i]==b[i+1];i++)
{
Next[1]=i;
int tmp=1;
for(int k=2;k<len;k++)
{
int p=tmp+Next[tmp]-1,L=Next[k-tmp];
if((k-1)+L>=p)
{
int j=(p-k+1)>0?(p-k+1):0;
while(k+j<len&&b[k+j]==b[j])
j++;
Next[k]=j,tmp=k;
}
else Next[k]=L;
}
}
} void getExtend(char a[],char b[])
{
memset(Next,0,sizeof(Next));
getNext(b);
int lena=strlen(a),lenb=strlen(b),tmp=0;
int minlen=lena<lenb?lena:lenb;
while(tmp<minlen&&a[tmp]==b[tmp])
tmp++;
extend[0]=tmp,tmp=0;
for(int k=1;k<lena;k++)
{
int p=tmp+extend[tmp]-1,L=Next[k-tmp];
if((k-1)+L>=p)
{
int j=(p-k+1)>0?(p-k+1):0;
while(k+j<lena&&j<lenb&&a[k+j]==b[j])
j++;
extend[k]=j,tmp=k;
}
else extend[k]=L;
}
}
Manacher:
const int MAXN=110010;
char s1[MAXN],Mt[MAXN*2];
int Mp[MAXN*2]; int Manacher(int len,char s[])
{
int Mx=0,id=0,L=0;
int ret=0;
Mt[L++]='$';Mt[L++]='#';
for(int i=0;i<len;i++)
{
Mt[L++]=s[i];
Mt[L++]='#';
}
Mt[L]=0;
for(int i=1;i<L;i++)
{
if(Mx>i)
Mp[i]=min(Mp[id*2-i],Mx-i);
else
Mp[i]=1;
while(Mt[i+Mp[i]]==Mt[i-Mp[i]])
Mp[i]++;
if(Mp[i]+i>Mx)
{
Mx=Mp[i]+i;
id=i;
}
if(Mp[i]-1>ret)
ret=Mp[i]-1;
}
return ret;
}
字符串匹配—KMP 扩展KMP Manacher的更多相关文章
- 神奇的字符串匹配:扩展KMP算法
引言 一个算是冷门的算法(在竞赛上),不过其算法思想值得深究. 前置知识 kmp的算法思想,具体可以参考 → Click here trie树(字典树). 正文 问题定义:给定两个字符串 S 和 T( ...
- Kuangbin 带你飞 KMP扩展KMP Manacher
首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...
- ACM之路(12)—— KMP & 扩展KMP & Manacher
最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...
- 模式字符串匹配问题(KMP算法)
这两天又看了一遍<算法导论>上面的字符串匹配那一节,下面是实现的几个程序,可能有错误,仅供参考和交流. 关于详细的讲解,网上有很多,大多数算法及数据结构书中都应该有涉及,由于时间限制,在这 ...
- kuangbin专题十六 KMP&&扩展KMP HDU2328 Corporate Identity
Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...
- kuangbin专题十六 KMP&&扩展KMP HDU1238 Substrings
You are given a number of case-sensitive strings of alphabetic characters, find the largest string X ...
- kuangbin专题十六 KMP&&扩展KMP POJ3080 Blue Jeans
The Genographic Project is a research partnership between IBM and The National Geographic Society th ...
- 【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法
[KMP] 学习KMP,我们先要知道KMP是干什么的. KMP?KMPLAYER?看**? 正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .- 啊跑题了. KMP就是给出一 ...
- kmp&扩展kmp
kmp: KMP的主要目的是求B是不是A的子串,以及若是,B在A中所有出现的位置 写的很详细的大佬的博客:http://www.matrix67.com/blog/archives/115 模板: / ...
随机推荐
- Python2 基于urllib2 的HTTP请求类
一个利用urllib2模块编写的下载器,虽然有了requests模块,但是毕竟标准库 import urllib2,random class strong_down(): def __init__(s ...
- Android学习笔记(一)Git相关配置及使用
一.配置 打开Git Bash, git config --global user.name "username" git config --global user.email & ...
- python爬虫---python3.5---eclipse
解析中文会出现\xbe\c8\90\hd........ 这个和你的编码选择有关.如果是解析成html,则需 fout = open('output.html', 'w',encoding='utf- ...
- svn clean up 出错解决方案
问题描述:svn执行clean up命令时报错"Previous operation has not finished; run 'cleanup' if it was interrupte ...
- Tiny6410之NAND FLASH驱动
一.NAND FLASH的特点 S3C6410的NAND FLASH控制器有如下特点 1.自导入模式:复位后,引导代码被送入到8KB的STEPPINGSTONE中,引导代码移动完毕,引导代码将在STE ...
- Unity启动事件-监听:InitializeOnLoad
[InitializeOnLoad] :在启动Unity的时候运行编辑器脚本 官方案例: using UnityEngine; using UnityEditor; [InitializeOnLoa ...
- Jenkins slave image
Add a new shell script configure_slave.sh as following: #!/bin/bash dnf -openjdk git wget openssh-se ...
- android相关内容
一: 前台进程: 前台的进程的优先级最高, 可见进程: android系统一般存在少量的可见进程. 服务进程: 没有用户界面, 后台进程: 一般存在较多的后台进程. 空进程: 不包括任何活跃组件的进程 ...
- Spring Security(15)——权限鉴定结构
目录 1.1 权限 1.2 调用前的处理 1.2.1 AccessDecisionManager 1.2.2 基于投票的AccessDecisionManager实 ...
- 递归——CPS(一)
程序中为什么需要栈stack? 普通的程序中,接触到子程序和函数的概念,很直观地,调用子程序时,会首先停止当前做的事情,转而执行被调用的子程序,等子程序执行完成后,再捡起之前挂起的程序,这有可能会使用 ...