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 · 329 阅读 · 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 · 808 阅读 · 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 · 896 阅读 · 0 评论 -
POJ 2752 Seek the Name, Seek the Fame / KMP
做了HDU 3336 这题小casek=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 · 1098 阅读 · 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 · 1522 阅读 · 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 · 1243 阅读 · 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 · 1303 阅读 · 0 评论 -
POJ 2185 Milking Grid KMP循环节周期
题目来源:POJ 2185 Milking Grid题意:至少要多少大的子矩阵 可以覆盖全图 例如样例 可以用一个AB 组成一个ABABABABABAB 可以多出来 思路:每一行求出周期 总共n个 求这n个周期的最小公倍数 如果大于m 取m 每一列求出周期 总共m个求这个m个周期的最小公倍数 如果大于n取n答案就是2个最小公倍数的积#inc原创 2014-07-21 17:04:25 · 1060 阅读 · 0 评论 -
URAL 1732 . Ministry of Truth KMP
题目来源:URAL 1732 . Ministry of Truth题意:把第一个字符串处理一下 变成第二个 不要的字符改成下划线 空格不能改思路:对第二个字符串单词分割 得到每一个单词后从第一个字符串中匹配 匹配成功 记录当前匹配的位置 然后下一个单词从x+2处在匹配 知道所有的单词都被匹配到鄙视自己没想清楚写了半天 最后发现题目意思都错了改了很多 最后代码和原来原创 2014-08-30 10:07:03 · 921 阅读 · 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 · 1024 阅读 · 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 · 858 阅读 · 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 · 1117 阅读 · 0 评论