扩展KMP
刘雅琼论文 http://wenku.baidu.com/view/8e9ebefb0242a8956bece4b3.html
论文讲的非常详细。
给定母串S,子串T,n=strlen(S),m=stlrne(T);extand[i]=S[i...n]与T的最长公共前缀长度,要在线性时间求出所有extand[].



下面是代码
#define maxn 10010
int extand[maxn],next[maxn];
void getnext(char *t)
{
int i,j,len=strlen(t),k;
next[]=len;
i=;
while(i<len-)
{
if(t[i]==t[i+])
i++;
else break;
}
next[]=i;
int a=;//a表示之前匹配过程中到达最远位置的i的值
for(k=;k<len;k++)
{
int p=next[a]+a-;//p表示之前匹配到达最远的位置
int l=next[k-a];
if(k-+l>=p)//第二种情况 长度超过p
{
int j=p-k+1>0?p-k+1:0;
while(k+j<len&&t[k+j]==t[j])//枚举(p+1,length) 与(p-k+1,length) 区间比较
j++;
next[k]=j;
a=k;
}
else //第二种情况
next[k]=l;
}
}
void getextand(char *s,char *t)
{
memset(next,,sizeof(next));
getnext(t);
int slen=strlen(s),tlen=strlen(t),a=;
int minlen=slen<tlen?slen:tlen; while(a<minlen&&s[a]==t[a])a++;//第一个值
extand[]=a;
a=; for(k=;k<slen;k++)
{
int p=a+extand[a]-;
int l=extand[k-a];
if(k-+l>=p)
{
int j=p-k+1>0?p-k+1:0; while(k+j<slen&&j<tlen&&s[k+j]==t[j])
j++;
extand[k]=j;
a=k;
}
else
extand[k]=l;
}
}
扩展kmp求回文子串
http://blog.csdn.net/u013480600/article/details/23041391
扩展KMP的更多相关文章
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 扩展KMP --- HDU 3613 Best Reward
Best Reward Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...
- KMP和扩展KMP
文章网上太多这里提一下代码细节: KMP: scanf("%s\n",s); scanf("%s\n",t); int ls=strlen(s),lt=strl ...
- UVA5876 Writings on the Wall 扩展KMP
扩展KMP的简单题. #include<stdio.h> #include<string.h> #define maxn 51010 char s[maxn],t[maxn]; ...
- hdu4333 扩展KMP
慢慢研究可以发现,可以用扩展kmp来求.由于扩展kmp的next[]只有一部分,当前位子前面那部分和母串的后部分,所以可以将字符串复制接在后面一次. 先求如果next[]>0&& ...
- HDU 3336 扩展kmp
题目大意: 找到字符串中所有和前缀字符串相同的子串的个数 对于这种前缀的问题,通常通过扩展kmp来解决 其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模 ...
- acdream1116 Gao the string!(扩展KMP)
今天是字符串填坑的一天,首先填的第一个坑是扩展KMP.总结一下KMP和扩展KMP的区别. 在这里s是主串,t是模式串. KMP可以求出的是以s[i]为结尾的串和 t前缀匹配的最长的长度.假如这个长度是 ...
- hdu 4333(扩展kmp)
题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个.比如341-->134-->413-->3 ...
- 扩展KMP题目
hdu4333 /* 题意:字符串s[0..n-1],每次把最后一个字符放到前面,求形成的字符串比最初串分别小,相同,大于的个数 因为是为了练习扩展KMP所以肯定是扩展KMP, 为了循环方便,在后面复 ...
随机推荐
- 矩阵乘法 codevs 1287 矩阵乘法
1287 矩阵乘法 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 小明最近在为线性代数而头疼,线性代数确实很抽象 ...
- BUG描述规范
BUG描述规范 一. 目的与适用范围 1.1 目的 报告软件测试错误的目的是为了保证修复错误的人员可以明确报告的错误,从而有利于分析错误产生的原因,定位错误,然后修正之.因此,报告软件测试错误的基本要 ...
- docker中清理冗余的image,container
1) 首先进入超级用户模式 [root@docker ~]# sudo su2) 删除container ( container运行时是不能删除的 )首先停止container [root@docke ...
- Html之初体验
概述 HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言.相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏览器根据标记 ...
- 【转】【C#】【Thread】Mutex 互斥锁
Mutex:互斥(体) 又称同步基元. 当创建一个应用程序类时,将同时创建一个系统范围内的命名的Mutex对象.这个互斥元在整个操作系统中都是可见的.当已经存在一个同名的互斥元时,构造函数将会输出一个 ...
- 补鞋匠---Cobbler 服务器自动搭建
Cobbler 服务器自动搭建http://tshare365.com/archives/439.html
- easyui-combobox的取值问题
例子:<select id="cc" class="easyui-combobox" name="cc" style="wi ...
- 用python简单处理图片(4):图像中的像素访问
前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作.如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了.因此,通常我们加载完图片后,都 ...
- ubuntu16.04安装eclipse
1.下载jdk , jdk-8u77-linux-x64.tar.gz 2.下载 eclipse, eclipse-jee-mars-2-linux-gtk-x86_64.tar.gz 注:我下载的都 ...
- struts 2.5.5 通配符问题
问题:使用通配符会报错,找不到action. 问题原因: struts2.5 为了增加安全性,在 struts.xml 添加了这么个属性:<global-allowed-methods>r ...