KMP
qq_25243147
这个作者很懒,什么都没留下…
展开
-
HDU-4763 Theme Section
题意:求出各个形式为EAEBE的串中E的最大长度(A、B代表的串长度可为0)如aaa,E为a,最大长度为1;aabaabaa,E为aa,A为b,B为b,最大长度为2用到了最长公共前后缀,首先求出前后最长公共前后缀长度,...原创 2020-07-11 19:28:30 · 98 阅读 · 0 评论 -
HDU-4300 Clairewd‘s message
题意,第一行给出一个明文->密文转换表,第二行给出串密文明文,存在只有密文情况,如果存在后缀(后缀长度<=原串长度/2,因为密文长度>=已知明文长度)转为密文后与原串相比较存在最长公共前缀且长度等于转换前明文长度的话,则该被转换明文为答案明文的一部分,该明文前的串则为原密文。#include <cstdio>#include <cstring>#include <queue>using namespace std;const int N = 1原创 2020-07-10 15:02:58 · 74 阅读 · 0 评论 -
FZU-1901 Period II
fzufzufzuf,当p==3时,串的后缀fzufzufzuf与串fzufzufzuf的最长公共前缀为7,根据题意,此时i取0~6(注意加粗部分)fzufzufzuf****fzufzufzuf(s[i]==s[i+p],s[i]能比较部分也就只有这行加粗部分)所以只需保证,串的后缀与串的最长公共前缀==size(S) - p即可#include <cstdio>#include <cstring>#include <queue>using namespa原创 2020-07-08 15:32:37 · 87 阅读 · 0 评论 -
HDU-2609 How many
几个月前做过了,而且也理解了最大最小表示法,不过今天看了一遍题又忘了,#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 1e4 + 5;struct abc{ char str[105];}S[N];int getMin(char *s){ int n = strlen(s); int i = 0,j = 1,原创 2020-07-07 16:03:35 · 64 阅读 · 0 评论 -
HDU-3336 Count the string
题意:给一个串,求出这个串所有前缀出现的次数和。之前没考虑到,next[i]指第i个字符新加进来时的最长公共前后缀长度;当i=6时,即加上第6个字符b时,next[6] = 4,此时前缀abab == 后缀abab(加粗位置为新加入的字符b),结果+1, 而next[4] = 2,则ab == ab,即前缀abab 与 后缀abab中的ab相等,但因为后面的b是新加进来的,所以结果+1。#include <cstdio>#include <cstring>using na原创 2020-07-06 19:54:07 · 97 阅读 · 0 评论 -
POJ-3080 Blue Jeans
题意:在给出的所有串中找出一个长度大于三且字典序最小的最长模式串并输出,否则输出no significant commonalities。思路:如果存在模式串,则该模式串可成功匹配到所有串,枚举出第一个串的全部子串作为模式串,与其他串进行匹配。#include <cstdio>#include <cstring>using namespace std;char s[15][65], p[65];int next[65], lp, ls, flag;void get_ne原创 2020-07-06 17:59:57 · 125 阅读 · 0 评论 -
HDU-1358 Period
题意:给出一个字符串s,问在[0, i]区间是否有完整的循环节,若有,输出i并输出循环次数思路:求出Next数组,再使用最小循环节定理判断在各个长度下该字符串是否有循环节。#include <cstdio>#include <cstring>using namespace std;const int N = 1e6 + 5;char p[N];int pl, next[N];void get_next(){ int i = 0,j = -1; next[0] =原创 2020-07-05 19:35:13 · 85 阅读 · 0 评论 -
HDU-3746 Cyclic Nacklace
题意大概是在该字符串末尾最少添加多少个字符,可以让这个字符串获得重复循环序列。最小循环节长度L = 字符串的长度sL - Next[sL],循环节循环次数c = sL / L字符串循环条件:sL % L == 0#include <cstdio>#include <cstring>using namespace std;const int N = 1e5 + 5;char p[N];int next[N], pl;void get_next(){ int i =原创 2020-07-05 00:14:51 · 56 阅读 · 0 评论 -
HDU-2087 剪花布条
模板题。#include <cstdio>#include <cstring>using namespace std;const int N = 1e3 + 5;char s[N], p[N];int sl, pl, next[N];void get_next(){ int i = 0,j = -1; next[0] = -1; while(i < pl) { if(j == -1 || p[i] == p[j]) next[++i] = ++j;原创 2020-07-04 17:58:39 · 122 阅读 · 0 评论 -
HDU-1686 Oulipo
思路:模板题,在匹配成功后,因为下一个匹配到的位置的前缀可能是前一个匹配到的位置的后缀,所以每匹配成功执行i = next[i]。#include <cstdio>#include <cstring>using namespace std;char s[1000005], p[10005];int sl, pl, next[10005];void get_next(){ int i = 0,j = -1; next[0] = -1; while(i < pl)原创 2020-07-04 17:34:44 · 88 阅读 · 0 评论 -
HDU-1711 Number Sequence
HDU-1711Number Sequence(KMP模板题)思路:模板题,用整数数组把主串模式串存起来。#include <cstdio>using namespace std;const int N = 1e6 + 5;int s[N], p[N];int sl, pl, next[N];void get_next(){ int i = 0,j = -1; next[0] = -1; while(i < pl) { if(j == -1 || p[i] ==原创 2020-07-04 16:57:49 · 70 阅读 · 0 评论