字符串匹配—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 模板: / ...
随机推荐
- 使用java连接MySql,中文乱码解决的方法
排查MySql中文乱码的问题 1.在cmd中启动MySql. 打开命令提示符cmd,输入"mysql -uusername -ppassword",回车,就可以连接到数据库. 如输 ...
- SqlDataReader中的GetSqlValue()方法
sdr.GetValue(0) "Title"sdr.GetValue(1)4sdr.GetValue(2)falsesdr.GetValue(3)0sdr.GetValue(4) ...
- JDK安装(CentOS/rpm方式)
1. 用如下命令检验是否已经自带了OpenJDK java -version 如果打印如下,则表示安装了OpenJDK java version "1.6.0" OpenJDK R ...
- centos7下引导win7
1.使用root身份(必须)打开 /boot/grub2/grub.cfg 2.找到 ### BEGIN /etc/grub.d/30_os-prober ### 在后面添加 menuentry &q ...
- NYOJ-括号配对问题 <技巧性的非栈道法>
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=100) ...
- js字符串操作
javascript中字符串常用操作总结.JS字符串操作大全 String对象属性 (1) length属性 length算是字符串中非常常用的一个属性了,它的功能是获取字符串的长度.当然需要注意的是 ...
- CSU 1810 Reverse
湖南省第十二届大学生计算机程序设计竞赛$H$题 规律,递推. 这种问题一看就有规律.可以按位统计对答案的贡献.即第$1$位对答案作出了多少贡献,第$2$位对答案作出了多少贡献.....累加和就是答案. ...
- webAPI---发布(IIS)--发布遇到问题(500.19,500.21,404.8,404.3)
WebAPI的内容部分直接转自官方文档,英语水平有限,不做翻译, 发布网站在本文的后半部分 HTTP is not just for serving up web pages. It is also ...
- F9 excel上传
1 在前台制定文件上传按钮 <div id="dataImport" class="mini-webuploader" pickerText=" ...
- WIN7x64+VS2010+OpenCV2.4.10+cmake3.5.0重新编译OpenCV
1,参考博文 Win7x64+VS2012+OpenCV2.4.3+CMake2.8.10+TBB41重编译OpenCV [OpenCV入门教程之七] 玩转OpenCV源代码:生成OpenCV工程解决 ...