
字符串-------KMP
Soar-
这个作者很懒,什么都没留下…
展开
-
KMP算法
KMP 算法 简介: KMP算法是一种能够在线性时间内求出一个串在另一个串的所有匹配位置.核心: KMP算法中失配数组 F[ i ] 的求解. F[i] 数组表示主串S中以第i个字符(S[i-1])为尾的后缀与模式串T的前缀的最长公共部分.KMP本质其实是看主串S中每个i位置的后缀最多能与T的多长的前缀匹配的算法. 也就是前缀匹配后缀的算法. 进行模式匹配只是一个附加的结果. 比如...原创 2018-09-04 22:44:47 · 145 阅读 · 0 评论 -
Oulipo POJ - 3461 (KMP模板)
题意: 给你一个T串和P串,问你P串在T串中出现了多少次.分析: 直接套用KMP模板即可. 注意失配指针最后一个'\0'也有定义. #include<cstdio>#include<iostream>#include<cstring>using namespace std;const int maxn ...原创 2018-09-05 09:40:56 · 145 阅读 · 0 评论 -
Count the string HDU - 3336(KMP+DP, 串前缀匹配自身)
题意: 给定一个串,求用该串所有前缀去匹配这个串次数的总和.分析: 失配指针数组的应用: dp[i] 表示 S[0,i-1] 串的后缀能匹配的前缀的个数.则dp[i] = dp[f[i]] + 1; 初始化 dp[1]=1;这里用到的就是失配指针的含义:后缀与前缀. #include<bits/stdc++.h>using namesp...原创 2018-09-05 15:26:21 · 122 阅读 · 0 评论 -
Blue Jeans POJ - 3080 (多个字符串的最长公共子串)
题意: 给定n个字符串,要你求出这n个字符串的最长公共子串,如果存在多个输出字典序最小的那个.分析: KMP+暴力去枚举即可.#include<stdio.h>#include<string.h>const int maxn = 107;const int oo = 1e9+7;char s[maxn][maxn];in...原创 2018-09-05 16:02:18 · 752 阅读 · 0 评论 -
剪花布条 HDU - 2087(KMP 贪心选择)
题意: 给定两个串S 和 T,求S中最多不重叠的包含了多少个T串.分析: 不重叠的话,就是在正常的KMP基础上,匹配到T的末尾的时候,j要回到0. #include<bits/stdc++.h>using namespace std;const int maxn = 1111;char s[maxn],t[maxn];int f[maxn...原创 2018-09-05 16:37:50 · 263 阅读 · 0 评论 -
亲和串 HDU - 2203 (KMP 循环移位一个串去匹配)
题意: 判断P串是不是能和T串循环移位K位后的字符串有匹配点分析: 把T往自身后面贴一下变成TT,然后看P在TT中有没有匹配点即可~~~ 这种往后帖一下的思想可以说是一种技巧,比如:求数组挖去连续一块后求剩下的有多少个不同的数.#include<bits/stdc++.h>using namespace std;const int maxn = 100000+...原创 2018-09-05 16:49:03 · 168 阅读 · 0 评论 -
Seek the Name, Seek the Fame POJ - 2752 (KMP 失配指针数组)
题意: 给定一个串T,找出串T的子串,该串即既是T的前缀也是T的后缀.从小到大输出所有符合要求的子串的长度.分析: 把答案就是f[m] f[ f[m] ]...依次下去.理解f数组的前缀后缀思想这道题就迎刃而解了. #include<bits/stdc++.h>using namespace std;const int maxn = 1e7;ch...原创 2018-09-05 17:23:45 · 165 阅读 · 0 评论 -
2018第九场暑期牛客多校 F --- KMP
题意: 给定n(<4)个字符串,然后有一个操作:逐个输入一个长为L字符串,字符串中出现 减号 代表删除一个字符,问每次输入一个字符或者删除一个字符后再输入最少多少个 后缀能出现前面n个字符串之一.分析: KMP算法:用前面n个字符串逐个去匹配后面的操作字符串,所求答案为m-j. 但是删除怎么处理呢,用栈去维护. 但是这道题是卡MP算法的失配函数的. 极限情...原创 2018-09-06 01:12:29 · 247 阅读 · 0 评论