[KMP]匹配长度恰为x的位置数
来源:互联网 发布:oracle rownum删除数据 编辑:程序博客网 时间:2024/05/16 17:19
给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度。
给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个。
N,M,K<=200000
输出
6 2 2
aabcde
ab
0 2
输出
4 1//-----------------------------------------------------------------------------
考虑下面的例子:
A串:abbabbabababbababba
B串:abbabababba
应用KMP算法,很容易得到B串的自我匹配是
元素 a b b a b a b a b b a
位置 1 2 3 4 5 6 7 8 9 10 11
长度 0 0 0 1 2 1 2 1 2 3 4
这个数组记为kmp[位置] = 匹配长度。
由此求得到A串的各个元素尾部的匹配长度是
a b b a b b a b a b a b b a b a b b a
1 2 3 4 5 3 4 5 6 7 8 9 10 11 5 6 7 3 4
统计出各个长度的出现频数
长度 0 1 2 3 4 5 6 7 8 9 10 11
频数 0 1 1 3 3 3 2 2 1 1 1 1
这个数组记作cnt[长度] = 频数。
根据KMP自我匹配数组的性质,如果以A串某个元素结尾有一个长度为11的字串可以与B串匹配的话,以该元素结尾的长度为kmp[11] = 4的字串也是可以匹配的。所以说cnt[4] += cnt[11]。也就是说,进行这样的操作
for (i = N; i >= 1; i--)
cnt[kmp[i]] += cnt[i];
for i := N downto 1 do
inc( cnt[ kmp[i] ] , cnt[i] );
之后,cnt[i]中保存的就应该是所有长度为i的匹配字串了。这时cnt数组的状态是
长度 0 1 2 3 4 5 6 7 8 9 10 11
频数 19 8 7 4 4 3 2 2 1 1 1 1
然而题中要求的是“长度恰好为i”的子串的个数,也就是这些字串的下一个字符是不能匹配的。然而,cnt数组中存储的cnt[i],必然包含了cnt[i + 1]及以上的情况。然而这很简单,“长度恰好为i”的字串数量就是cnt[i] - cnt[i + 1],因为cnt[i]中可以扩展的字串必然都包含于cnt[i + 1]。
时间复杂度O(M + N)
#include<iostream> #include<string>#include<cstdio>using namespace std; int c[200010];int f[200010];string a,b;int n,m,k;void getfail(){for(int i=1;i<m;++i){int j=f[i];while(j && b[i]!=b[j])j=f[j];f[i+1]= b[i]==b[j]? j+1:0;}}int find(){int j=0;for(int i=0;i<n;++i){while(j && a[i]!=b[j])j=f[j];if(a[i]==b[j])j++;c[j]++;}}int main() {ios::sync_with_stdio(false);cin>>n>>m>>k;cin>>a>>b;getfail();find();for(int i=m;i>0;--i)c[f[i]]+=c[i];for(int i=0;i<=m;++i)c[i]-=c[i+1];for(int i=1;i<=k;++i){int r;cin>>r;cout<<c[r]<<'\n';} return 0; }
- [KMP]匹配长度恰为x的位置数
- KMP求匹配字符串位置
- (6)KMP算法(求子串的位置)______字符串的匹配
- KMP / hdu 1711 [找到匹配的位置并返回]
- KMP / hdu 1711 [找到匹配的位置并返回]
- 【Codeforces Round 299 (Div 2)D】【KMP 本质是最前与最后匹配】Tavas and Malekas 长度为n的匹配串被模板串多位点覆盖的匹配串个数
- kmp模式串2求匹配的趟数
- hdu 2087 KMP裸题【没有交集的匹配数】
- 单模式匹配KMP求匹配位置和匹配数目
- HDU 1711 KMP求匹配位置
- leetcode-28-匹配字符串位置(KMP)
- 字符串的匹配 -KMP
- kmp字符串的匹配
- hdu 1711 Number Sequence -- (KMP 求数列第一匹配的位置)
- 点分治:统计长度为K的路径条数
- hdu 1686 kmp统计匹配数
- Determine the Position and Length of the Match (获取匹配的起始位置,终止位置,和长度)
- 给一个数轴,包括正无穷和负无穷,从原点0开始向目标位置x走动(x为整数),第i步,步长为i,求到x的最少步数
- u-boot如何向内核传递Flash的分区信息
- 等概率随机函数的实现
- 实现Android下的FPS实时显示工具
- 技术链接收集
- Arcgis desktop 9.3安装详解
- [KMP]匹配长度恰为x的位置数
- scsi设备模型一
- js获取动态时间
- 移动设计八原则
- SVN 下载(struts2 ) 开源源码
- hdu 题目1171 Big Event in HDU(母函数及其应用)
- Log4j 配置最全说明
- LIBPNG读写PNG文件
- mysql开启慢查询方法