博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【codevs1404】字符串匹配 KMP
阅读量:5155 次
发布时间:2019-06-13

本文共 1112 字,大约阅读时间需要 3 分钟。

题目描述

给你两个串A,B,可以得到从A的任意位开始的子串和B匹配的长度。

给定K个询问,对于每个询问给定一个x,求出匹配长度恰为x的位置有多少个。
N,M,K<=200000

输入

第一行三个数 N,M,K,表示A的长度、B的长度和询问数。

第二行为串A。
第三行为串B。
接下来K行,每行1个数X。

输出

对于每个询问输出一个数。

样例输入

6 2 2

aabcde
ab
0
2

样例输出

4

1


题解

KMP先求出next数组,匹配一遍,统计一下某长度出现的次数num。

这是以每个字符结尾的出现次数,然而落下了一部分。

为了得到总数,需要从后向前执行num[next[i]]+=num[i]可以得到能够匹配某长度的个数。

而题目要求是“恰好匹配”,所以答案为num[i]-num[i+1]。

KMP细节太多了。。。

#include 
#include
char A[200001] , B[200001];int next[200001] , num[200001];int main(){ int n , m , k , i , j; scanf("%d%d%d%s%s" , &n , &m , &k , A , B); for(i = 1 ; i < m ; i ++ ) { j = next[i]; while(j && B[i] != B[j]) j = next[j]; if(B[i] == B[j]) next[i + 1] = j + 1; else next[i + 1] = 0; } for(i = j = 0 ; i < n ; i ++ ) { while(j && A[i] != B[j]) j = next[j]; if(A[i] == B[j]) j ++ ; num[j] ++ ; } for(i = m ; i > 0 ; i -- ) num[next[i]] += num[i]; while(k -- ) { scanf("%d" , &i); printf("%d\n" , num[i] - num[i + 1]); } return 0;}

转载于:https://www.cnblogs.com/GXZlegend/p/6277315.html

你可能感兴趣的文章
debian9 设置
查看>>
5句话搞定ES5作用域
查看>>
Build tool
查看>>
php 小坑记录
查看>>
2018.7.28 二叉树的遍历规则(前序遍历、后序遍历、中序遍历)
查看>>
通过 poi 导入 Excel代码
查看>>
《CSS基础教程》 读书笔记三
查看>>
洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...
查看>>
PHP安全新闻早8点_1127
查看>>
57.Insert Interval
查看>>
PHP 五大运行模式
查看>>
CSS选项卡
查看>>
HDOJ1203 I NEED A OFFER!
查看>>
ZH奶酪:自然语言处理工具LTP语言云调用方法
查看>>
.NET中将图片文件流转成Base64字符串的实现
查看>>
js如何操作或是更改sass里的变量
查看>>
BZOJ1419: Red is good
查看>>
腾讯云-搭建 JAVA 开发环境
查看>>
POJ 3308 Paratroopers (对数转换+最小点权覆盖)
查看>>
rendering omni shadow in one pass.
查看>>