![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
KMP
芋智波佐助
菜鸟一只
展开
-
HDU 5442 Favorite Donut 最大表示法+KMP
首先2次最大表示法求出顺序和逆序情况下的位置,不过逆序求出来的是最大的下标,可以利用循环节来推出最小的位置。 #include #include #include using namespace std; const int maxn = 1000010; int f[maxn]; char s[maxn]; void getFail(char p[]) { int m原创 2016-07-13 09:34:26 · 317 阅读 · 0 评论 -
POJ 3461 Oulipo / KMP
基础KMP 开始学AC自动机了 先搞清楚KMP #include #include using namespace std; const int maxn = 1000010; char a[maxn], p[maxn]; int f[maxn]; void getFail() { int m = strlen(p); f[0] = f[1] = 0; for(int i = 1; i原创 2014-03-24 16:09:59 · 800 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace / KMP
首先 t = n-next[n]是周期 n是字符串长度 如果 n%t = =0 那么该字符串是一个周期串 如果n%t !=0 t还是周期 只不过末尾多一部分 话句话说 该字符串是由若干个t和一段字符x组成 如果没有x那么它就是一个周期串 并且x和t的开头是相同的 就是x是t的前缀 那么x的长度是多少呢 是n%t 既然x是t的前缀 就满意补上一些字符使x变成t 补多少字符呢 t-n%t ,原创 2014-03-25 12:42:53 · 885 阅读 · 0 评论 -
POJ 2752 Seek the Name, Seek the Fame / KMP
做了HDU 3336 这题小case k=next[n] 是最长的前缀 这题还要求不是最长的前缀 那么就 k = next[k] #include #include const int maxn = 400010; const int mod = 10007; char a[maxn]; int f[maxn]; int dp[maxn]; int n, flag; void print原创 2014-03-25 16:16:01 · 1085 阅读 · 0 评论 -
HDU 4749 Parade Show 相对匹配的KMP
题目来源:HDU 4749 Parade Show 题意:从长度为n的序列最多能找到多少个不重叠的的连续的子串 和长度位m的序列的相对大小相同 思路:转化成KMP 把原来的字母相同换成一个检测是否相对大小相同的函数 具体参考了http://blog.csdn.net/no__stop/article/details/11949743 #include #include const i原创 2014-04-08 14:57:24 · 1511 阅读 · 3 评论 -
Light OJ 1268 Unlucky Strings 矩阵快速幂+KMP
题目来源:Light OJ 1268 Unlucky Strings 题意:给你一些可以用的字符 然后求组成不包含给定字符串的方案数 思路:矩阵经典问题 从i走k步路到达j的方案数 可以用矩阵快速幂求解 对于求长度为n的字符的方案数 就是走n步路 求走法 可以用KMP求出走一步 从前i个字符到前j个字符的方案数 这点有点不好理解 想一想 #include #include #原创 2014-06-04 19:38:41 · 1226 阅读 · 0 评论 -
Light OJ 1334 Genes in DNA KMP+DP
题目来源:Light OJ 1334 Genes in DNA 题意:输入文本串和模式串 模式串的前缀和后缀组成(n-1)*(n-1)个组合 求模式串的子串出现多少次前后缀组合 一个子串可以对应多个组合串 思路:既然是前缀和后缀的组合 很好想到正反求2次KMP 枚举相邻的2个字符 i,j 答案就是若干以i结尾的前缀数量乘以j为开始的后缀数量的积的和 求到i字符为止的前缀数量和HDU 333原创 2014-06-02 15:55:36 · 1296 阅读 · 0 评论 -
POJ 2185 Milking Grid KMP循环节周期
题目来源:POJ 2185 Milking Grid 题意:至少要多少大的子矩阵 可以覆盖全图 例如样例 可以用一个AB 组成一个 ABABAB ABABAB 可以多出来 思路:每一行求出周期 总共n个 求这n个周期的最小公倍数 如果大于m 取m 每一列求出周期 总共m个求这个m个周期的最小公倍数 如果大于n取n 答案就是2个最小公倍数的积 #inc原创 2014-07-21 17:04:25 · 1048 阅读 · 0 评论 -
URAL 1732 . Ministry of Truth KMP
题目来源:URAL 1732 . Ministry of Truth 题意:把第一个字符串处理一下 变成第二个 不要的字符改成下划线 空格不能改 思路:对第二个字符串单词分割 得到每一个单词后从第一个字符串中匹配 匹配成功 记录当前匹配的位置 然后下一个单词从x+2处在匹配 知道所有的单词都被匹配到 鄙视自己没想清楚写了半天 最后发现题目意思都错了 改了很多 最后代码和原来原创 2014-08-30 10:07:03 · 913 阅读 · 0 评论 -
URAL 1684. Jack's Last Word KMP
题目来源:URAL 1684. Jack's Last Word 题意:输入a b 把b分成若干段 每一段都是a的前缀 思路:b为主串 然后用a匹配b 记录到b的i位置最大匹配的长度 然后分割 分割的时候要从后往前 如果a = abac b = abab 那么如果从前往后 首先覆盖了aba 然后b就不能覆盖了 从后往前就可以了 首先覆盖ab 下一次还是ab 因为已经记录了到i位置的最大匹配原创 2014-08-12 19:08:01 · 1014 阅读 · 0 评论 -
HDU 3336 Count the string / KMP
都是找和前缀一样的有多少个 想到KMP 然后要求的不是最长的前缀 只要是前缀都算 因此巧妙的借助Next数组 再来一个dp 有点前缀和的思想不好说 慢慢揣摩 #include #include const int maxn = 200010; const int mod = 10007; char a[maxn]; int f[maxn]; int dp[maxn]; int n, m;原创 2014-03-25 11:00:30 · 852 阅读 · 0 评论 -
Light OJ 1258 Making Huge Palindromes 末尾添加最少字符变回文串
题目来源:Light OJ 1258 Making Huge Palindromes 题意:末尾添加最少的字符是使输入的串变成回文 输出长度 思路:直接KMP匹配出它和它反串的最大匹配 n减去它就是要添加的数量 #include #include #include using namespace std; const int maxn = 1000010; char a[maxn],原创 2014-05-27 17:53:12 · 1103 阅读 · 0 评论