Next数组求法

不用初始化,因为Next数组是递推出来的。用法为getFail(s,strlen(s)).

const int MAX_N=101000;
char str[MAX_N],pattern[MAX_N];
int Next[MAX_N];
void getFail(char *p,int plen){int i;Next[0]=0;Next[1]=0;for(i=1;i<plen;i++){int j=Next[i];while(j&&p[i]!=p[j])j=Next[j];Next[i+1]=(p[i]==p[j])?j+1:0;}
}

囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖
学习笔记
KMP的Next数组可以求一个字符串的最小循环节,如果它有的话。
循环节长度 x=len-Next[len]。
比如ababab,x为2
abbcabbcabbc,x为3
但是如果是abba的话x为3,如果想要求这个字符串的最小循环节长度再加一个判断条件即可,
即如果len%x!=0的话x=len。
像abba,x应该为len,即为4.
像abbabba,x应该为7,abbabbab,x为8,abbabbabb,x为3,因为它可以整除了。
另一个问题,如果一个字符串,我最少需要添加多少个字符才可以出现2个及以上的循环。
添加字符之后的字符串的最小循环节长度为len-Next[len]。
那么答案即为(len-Next[len])-len%(len-Next[len])。
可以看成(循环节)-字符串长度%(循环节)。
定理如果一个字符串有循环节的话且循环节且总长度可以整除循环节,即没有末尾循环节破损,那么最小循环节长度为len-Next[len],如果循环节破损,那么在没法添加字符的条件下最小循环节长度即为字符串本身长度len,而在可以添加字符的条件下,如果想要添加字符串数量最少,那么添加完之后字符串的最小循环节为len-Next[len]。

囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖囖

利用Next数组求字符串的前缀在字符串中出现的次数。
利用dp,dp[i]代表字符串的第1个字符到第i个字符这个子串出现在字符串中的次数(字符串下标从1开始,方便),这个出现次数是可重复的,比如aaaaa的dp[2]为4。
dp数组求法

int len=strlen(s);
getFail(s,len);
for(i=1;i<=len;i++)dp[i]=1;
for(i=len;i>=1;i--)dp[Next[i]]+=dp[i];

小思维:
求字符串a的每个前缀在b中出现的次数。
可以把构建一个字符串c=a+’#’+b,然后求出dp_c,然后再求出dp_a,那么答案就为dp_c[i]-dp_a[i]。

KMP的Next数组应用总结相关推荐

  1. KMP中next数组的理解

    next数组是KMP的核心,但对于next数组我们总是有时候感觉明白了,但有时候又感觉没明白,现在我就说下我自己对KMP中next数组的理解,首先next[i]上的数字的意义,next[i]表示的是当 ...

  2. CodeForces - 1137B Camp Schedule(KMP的next数组+构造)

    题目链接:点击查看 题目大意:给出一个主字符串s,再给出一个子字符串ss,主串和子串都是只由0或1所组成的字符串,现在要求重组主串s,要求重组后的字符串: 所包含的0与1的个数与之前保持一致 尽可能多 ...

  3. HDU - 1358 Period(KMP的next数组求最小循环节)

    题目链接:点击查看 题目大意:给出一个长度为n的字符串,问有哪些前缀是周期性字符串 题目分析:因为n给的很大,所以肯定不能暴力判断了,我们可以巧妙的利用kmp的next数组进行判断,next数组有一个 ...

  4. HDU - 3746 Cyclic Nacklace(KMP的next数组判循环节)

    题目链接:点击查看 题目大意:现在规定想要制作一串珍珠手链,需要用到两段一模一样的字符串首位相接而成,现在给定一个字符串,问最少需要添加几个珍珠才能满足条件 题目分析:一开始以为是个简单的模拟题,但后 ...

  5. KMP的next[]数组

    KMP是众多字符串问题的基础 理解next数组尤为重要 next又称前缀数组 是 它所处位置的前一个位置的元素 与 该链 链首开始 几个元素相匹配(即相同) 举个实例来说明: next对应的是该位置的 ...

  6. hdu3746 KMP的next数组应用,求项链首尾项链循环

    题意:       给你一个项链,问你最少加多少个珠子能满足整个项链是一个循环的项链(首尾相连) 思路:      KMP的简单应用只要了解next数组的意义就好说了,下面总结下  next在循环方面 ...

  7. Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

    题目链接: https://codeforces.com/contest/432/problem/D 题解: 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大 ...

  8. HDU - 3374 String Problem(最小表示法+最大表示法+KMP的next数组)

    题目链接:点击查看 题目大意:给出一个字符串,现在问字符串不断向左循环所能形成的n个字符串中,字典序最小和最大的字符串的编号为多少,分别有多少个 题目分析:字符串最小表示法的模板题,证明和模板都是看大 ...

  9. HDU - 6153 A Secret(KMP的next数组性质/扩展KMP)

    题目链接:点击查看 题目大意:给出两个字符串a和b,我们首先定义L:字符串b当前的后缀子字符串长度,N:字符串b当前的后缀在字符串a中出现的次数,现在询问,对于字符串b的每一个后缀,求出L*N之和,答 ...

最新文章

  1. 那些你所不知道的AI视频资源
  2. 嵌入式开发都需要会些什么
  3. 【BZOJ-2668】交换棋子 最小费用最大流
  4. 切换数据库_硬核数据库postgres使用pgpool完成主备自动切换,快来盘它
  5. 不一样的结果,不一样的人生
  6. 基础篇5-python基本数据类型讲解1.1
  7. NB-IoT 连接数过亿,开发者如何抓住新机遇?
  8. 第八章 文件资源共享
  9. matlab 函数教程,MATLAB函数 - Matlab教程
  10. 辛客小杰个人博客源码
  11. 基于pandas实现K折交叉验证数据集划分
  12. Python“Non-ASCII character 'xe5' in file”报错问题
  13. 谷歌(chrome)浏览器扩展程序
  14. Unity 5.5.0f3发行说明
  15. 查看pr 值是否劫持方法
  16. [Unity2D入门教程]简单制作仿植物大战僵尸游戏之①搭建场景
  17. Qt 使用QAxObject操作Word
  18. linux卸载netcdf,科学网-Ubuntu中安装netcdf4以上方法-伍志元的博文
  19. 25000 字详解 23 种设计模式,原来可以这么简单!
  20. 考研数学:罗尔定理的推论

热门文章

  1. hal库 spi--bl0942调试
  2. Oracle SQL语句进行新建用户
  3. flash下雨效果(附源码)
  4. 魔百盒CM201-2-YS易视腾代工
  5. 剑指offer刷题报告(Java)
  6. 甘孜州2021高考 康定中学宴冬梅成绩查询,康定中学
  7. stm32几款芯片的存储大小
  8. Hive-day06基本函数_窗口函数_行列转换_UDF_连续登录问题
  9. urllib使用案例
  10. pytorch 搭建 VGG 网络