首先看了几篇博客,发现还得耐下心来理解,动手画图 ,才能理解俩字符串还有数组之间神奇的关系

这篇博客图不错:https://segmentfault.com/a/1190000008663857

/*扩展kmp */
/*一开始假设求出了 next数组,然后去求extend数组,然后方法一样
next数组可以自己求自己*/
#include<stdio.h>
#include<string.h>
#define S 1000
#define T 1000
char s[S],t[T];
/* 母串 子串*/
int extend[S],nex[T],p,a;/*extend[a]=p p最大值 */
/* extend[i]数组 :s母串的 i开头后缀串 与 t子串的最长公共前缀
nex[i] 数组:t子串以 i开头后缀串 与 t子串的最长公共前缀
*/
void getnext()
{
a=0,p=0;
int m=strlen(t);
memset(nex,0,sizeof(nex));
nex[0]=m;/*自己本身作为前后缀*/
for(int i=1;i<m;i++)
{
if(i>=p||i+nex[i-a]>=p)
{
if(i>=p)
p=i;
while(p<m&&t[p]==t[p-i])
p++;
nex[i]=p-i;
a=i;
}
else
nex[i]=nex[i-a];
}
}
void getextend()
{
getnext();
a=0,p=0;
int n=strlen(s),m=strlen(t);
for(int i=0;i<n;i++)
{
if(i>=p||i+nex[i-a]>=p)/*i-a的含义,多看图*/
{
if(i>=p)
p=i;
while(p<n&&p-i<m&&s[p]==t[p-i])/*可以继续往后匹配*/
p++;
extend[i]=p-i;
a=i;/*记录下标*/
}
else
extend[i]=p-i;
}
// for(int i=0;i<n;i++)
// printf("%d ",extend[i]);
// printf("\n");
// for(int i=0;i<m;i++)
// printf("%d ",nex[i]);
// printf("\n");
return ;
}
int main()
{
while(~scanf("%s%s",s,t))
{
getextend();
}
return 0;
}

扩展KMP(记录学习过程)的更多相关文章

  1. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  2. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  3. 【GDOI2014 DAY2】Beyond (扩展KMP)

    [题目] [题意] Jodie和Aiden在做游戏.Jodie在一个长度为l字符串环上走路,他每离开一个就会记下格子当前字符.他让Aiden在他走了一圈后叫他停下来.Aiden决定耍一下Jodie,在 ...

  4. HDU 4333 Revolving Digits [扩展KMP]【学习笔记】

    题意:给一个数字,每一次把它的最后一位拿到最前面,一直那样下去,分别求形成的数字小于,等于和大于原来数的个数. SAM乱搞失败 当然要先变SS了 然后考虑每个后缀前长为n个字符,把它跟S比较就行了 如 ...

  5. A - A Secret (扩展kmp)

    题目链接:https://cn.vjudge.net/contest/283743#problem/A 题目大意:给你字符串s1和s2,然后问你s2的每一个后缀在s1中出现的次数之和(可重叠). 具体 ...

  6. Manacher模板,kmp,扩展kmp,最小表示法模板

    *N]; //储存临时串 *N];//中间记录 int Manacher(char tmp[]) { int len=strlen(tmp); ; ;i<len;i++) { s[cnt++]= ...

  7. HDU 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  8. Kuangbin 带你飞 KMP扩展KMP Manacher

    首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...

  9. POJ 3376 Finding Palindromes (tire树+扩展kmp)

    很不错的一个题(注意string会超时) 题意:给你n串字符串,问你两两匹配形成n*n串字符串中有多少个回文串 题解:我们首先需要想到多串字符串存储需要trie树(关键),然后我们正序插入倒序匹配就可 ...

随机推荐

  1. Spring Cloud Eureka整合使用和配置

    遵循SpringBoot三板斧 服务端 第一步加依赖 <dependency> <groupId>org.springframework.cloud</groupId&g ...

  2. javascript功能插件大集合 前端常用插件 js常用插件

    转载来源:https://github.com/jobbole/aw... 包管理器管理着 javascript 库,并提供读取和打包它们的工具.•npm – npm 是 javascript 的包管 ...

  3. JS面试准备二

    1.常用的字符串方法 1. indexOf:查找字符串某一项的初始位置2. slice:截取字符串(包含起始位置,不包含结束位置) 不会根据参数大小,交换参数位置 如果出现-1按倒数第一个数,如果出现 ...

  4. vue+webpack怎么分环境进行打包

    这里说下,webpack打包里面涉及到的东西,不止webpack,还有node的知识, node的全局变量process,process.env用于返回用户环境信息对象,因为是node的全局变量,所以 ...

  5. redis环境搭建及一主二从三哨兵模式配置

    一.单机redis环境搭建 1.安装: OS:linux redhat6.5 下载redis 官网下载链接:https://redis.io/download 把安装包上传到服务器,进行解压 [roo ...

  6. PHP中elseif与else if的区别

    在PHP中,正常情况下elseif和else if的用法及效果是一样的,但在使用带冒号的if语句时(也就是php替代)情况会有点不一样,比如: <?php  /*正确的写法*/  $a = 1; ...

  7. Eureka停更了?试试Zookpper和Consul

    在Spring Cloud Netflix中使用Eureak作为注册中心,但是Eureka2.0停止更新,Eureka1.0 进入了维护状态.就像win7一样,同样可以用,但是官方对于新出现的问题并不 ...

  8. 单列集合List

    1.Vector和ArrayList以及LinkedList区别和联系.应用场景 线程安全: Vector:如果创建Vector时没有指定容量,则默认容量为10,底层基于数组实现,线程是安全的,底层采 ...

  9. git的日常使用(补课)

    使用git的一些反响 如果在github上做一个仓库来使用的话... 首先手动在github上创建一个空的仓库,默认没有任何东西的 使用git的命令 git pull 创建的github仓库地址 能把 ...

  10. Java 添加、读取、删除Excel文本框

    本文介绍通过Java程序添加文本框到Excel的方法,添加文本框时,可以添加文本.设置文本方向.文本对齐方式.设置文本框大小.位置.填充色/填充图片.文本框旋转角度.文本框名称.可选文本.文本框隐藏或 ...