
数据结构-----KMP&扩展KMP
柒月 流火
菜
展开
-
POJ - 2752 Seek the Name, Seek the Fame KMP中 nxt[ ] 应用
POJ - 2752 Seek the Name, Seek the Fame题意:寻找整串字符中前缀和后缀相同的,并从小到大输出长度思路:设字符串长度为 n ,t = nxt[n]从t 往前找,如果 t 大于 0 ,则有长度为 t 的相同的前后缀,下一步 t = nxt[t] ,继续往下寻找。直到 t 小于等于 0 为止。例如:ababcababababcabab ...原创 2019-01-17 15:31:23 · 140 阅读 · 0 评论 -
CodeForces - 1016B Segment Occurrences
CodeForces - 1016B Segment Occurrences 题意:给定两个字符串 s 和 t ,有 q 次查询,每次给定 s 串的范围,求在这个范围内 t 串出现的次数(可以重叠)。思路:利用KMP算法#include<iostream>#include<cstdio>#include<cstring>#includ...原创 2019-03-16 16:17:46 · 156 阅读 · 0 评论 -
HDU - 3374 String Problem 求字符串的最大最小表示法 并求循环次数
HDU - 3374 String Problem 题意:给你一串字符,这串字符可以左移(将最前面一个字符放到字符串最后面)生成 strlen(s) 个字符串,求出其中字典序最小 和 最大 的字符串在原串的起始位置和出现的次数(如果存在多个最小或最大串,则输出rank值小的,即下标小的那个)。输出:最小字符串起始位置 出现次数 最大字符串起始位置 出现次数思路:...原创 2019-01-30 20:25:58 · 181 阅读 · 0 评论 -
HDU - 4763 Theme Section nxt数组应用 前中后含有最长相同字符数
HDU - 4763 Theme Section题意:给你一个字符串,可以看作“EAEBE”,A和B可以是任意字符或字符串(可以为空),求E的最大长度。思路:先求出 nxt 数组,如果存在符合题目要求的 EAEBE 形式,假设 nxt[len]=i,则存在x在下标为 [2*i,len-i) 的字符串当中使得 nxt[x]==i 。这样求的是无重叠的最大长度#include...原创 2019-02-08 20:58:14 · 129 阅读 · 0 评论 -
HDU - 4300 Clairewd’s message 拓展KMP 补齐明文,使明暗文相同
HDU - 4300 Clairewd’s message 题意:给你一个对应的转换表,这个转化表是明文对应的暗文表,也就是第一字母对应‘a’,第二个字母对应‘b’,然后给一个字符串,这个字符串的前一部分是暗文后一部分是明文(将暗文翻译成明文后这两部分字符串其实是一样的),但是后面一部分的明文可能不完整了,但不知道分界线从哪里,要我们打印出完整的暗文+明文思路:先把a全部都当作是...原创 2019-01-23 17:42:05 · 211 阅读 · 1 评论 -
HDU - 2609 How many 最小表示法应用
HDU - 2609 How many题意:给你n串项链(字符串可以左移),判断有多少种不同的项链思路:最小表示法+set如果这些长度相同的字符串通过旋转后相同,则他们的最小表示法一定相同,最后set的大小即为不同的串数。substr是C++语言函数,主要功能是复制子字符串,要求从指定位置开始,并具有指定的长度。如果没有指定长度_Count或_Count+_Off超出了源字...原创 2019-02-01 20:53:52 · 225 阅读 · 0 评论 -
POJ - 2406 Power Strings 求循环节次数
POJ - 2406 Power Strings题意:求循环节出现的次数例:ababab ab为循环节,出现三次思路:最小循环节长度为m: m=n-nxt[n]判断是否全由循环节组成的条件:len%m==0 特例:aabaabaa#include<iostream>#include<cstdio>#include<cstr...原创 2019-01-16 21:19:10 · 139 阅读 · 0 评论 -
HDU - 1358 Period KMP 求循环节和循环次数
HDU - 1358 Period 题意:从小到大输出 字符串由循环节组成的前缀 的长度,并输出循环节的次数思路:求出 nxt[] 数组,从头到尾遍历一遍判断是否是由循环节组成(满足条件:i%(i-nxt[i])==0 && nxt[i]!=0 )i-nxt[i] 为循环节的长度#include<iostream>#include<cs...原创 2019-01-16 20:09:15 · 178 阅读 · 0 评论 -
HDU - 3746 Cyclic Nacklace KMP next数组应用,求循环节并补全
HDU - 3746 Cyclic Nacklace题意:求最少添加多少个字符使字符串变成由 n (n>=2) 个循环节组成的字符串。思路:这个题需要用到一些与 nxt 数组有关的公式假设字符串长度为 len (代码中为 n )设最小循环节的长度为 m :m = len - nxt[len]设所需补全的字符数为 x :x = m-len%m = m-(len-m)...原创 2019-01-15 21:00:44 · 179 阅读 · 0 评论 -
HDU - 2328 Corporate Identity 暴力 || KMP 求最长公共子序列
HDU - 2328 Corporate Identity题意:求所有字符串中的最长公共连续子序列思路:暴力:找出最短字符串,枚举所有长度#include<iostream>#include<cstdio>#include<cstring>using namespace std;char s[4010][210];char a[2...原创 2019-01-25 21:23:02 · 285 阅读 · 0 评论 -
HDU - 2087 剪花布条 KMP查找子串,不能有重叠
HDU - 2087 剪花布条 思路:在查找时每当匹配成功,将 j=0#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1000010;int nxt[maxn];char a[maxn],b[maxn];int ...原创 2019-01-15 20:13:55 · 137 阅读 · 0 评论 -
HDU - 1686 Oulipo 简单KMP
HDU - 1686 Oulipo题意给定一个单词和一个字符串,求单词在字符串中出现的次数思路将单词当作模式串求 next(文中用 nxt 表示),把包含模式串最后一个字母所对应的前后缀也求出来(如果有n个字符则求到nxt[n]),根据最后的这个 nxt[n] 的值我们将知道与模式串相同的前缀在文本串的下一个位置。AZAAZAZAZAAZA的nxt值为:-1 0 -...原创 2019-01-15 16:58:17 · 334 阅读 · 0 评论 -
HDU - 1711 Number Sequence KMP模板题
HDU - 1711 Number Sequence#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=1000010;int nxt[maxn];int a[maxn],b[maxn];int n,m;void getn...原创 2019-01-15 15:28:24 · 197 阅读 · 0 评论 -
HDU - 3336 Count the string nxt[ ]应用 求 字符串的每一个前缀在字符串出现次数的总和(可重叠)
HDU - 3336 Count the string题意:参考了大佬的博客:https://blog.youkuaiyun.com/guodongxiaren/article/details/25742103求字符串的每一个前缀在字符串出现次数的总和(可重叠)思路: 以字符串ababa,求它的sum(前缀出现次数和)。我们可以得到它的next数组:下标 0 1 ...原创 2019-01-20 21:48:11 · 499 阅读 · 0 评论 -
HDU - 1238 Substrings 求最长连续子序列(可以为逆序)
HDU - 1238 Substrings 题意:求所有字符串中的相同连续子序列长度,可以是逆序2roseorchid结果为 2 ,第一个字符串中含有 ro ,第二个含有 or(ro的逆序)思路:找出最短的字符串,然后枚举用到了几个函数 strncpy strstr strrev strcpy#include<iostr...原创 2019-01-24 20:21:54 · 221 阅读 · 0 评论 -
HDU - 2594 Simpsons’ Hidden Talents KMP nxt[ ] 应用 求相同前后缀
HDU - 2594 Simpsons’ Hidden Talents 题意:求第一个字符串的前缀与第二个字符串的后缀最长相同的长度。输出这个前缀 和 他的长度思路:1、在两个字符串相连接处添加一个特殊符号(字符串中不会出现的符号)就行#include<iostream>#include<cstdio>#include<cstring>...原创 2019-01-17 20:54:52 · 148 阅读 · 0 评论 -
CodeForces - 126B Password KMP+dp思想
CodeForces - 126B Password 题意:给你一个字符串,找出一个最长子串 t ,t 既是前缀也是后缀,并且 t 在字符串中间也出现过思路:利用KMP求出 nxt 数组。然后预处理出整个字符串有多少个与该前缀相同的子串。用到DP思想,cnt[nxt[i]]+=cnt[i],倒着更新一遍。那么cnt大等于3的前缀,均为可行解利用next[next[i]]是次长...原创 2019-04-07 12:13:48 · 247 阅读 · 0 评论