中北大学2020年新生赛 白嫖怪Long Long (KMP)

原题链接

题意

Long Long准备去吃串串,刚好发现串串店正在搞活动,只要能帮店主解决一个问题,这一顿就可以白嫖。作为白嫖怪,Long Long怎么能错过这次机会,但是他是一个字符串渣渣,现在需要你来帮他解决。由于他十分着急吃串串,他只给你1s的时间解决这个问题。

问题是这样的:店主十分喜欢回文串(正着读和反着读都一样的字符串),比如 “nucun”,“acmmca” 这样的都是回文串,现在店主随机给你出两个字符串a和b,如果b串是回文串,求出a串中b串出现的个数和出现的所有位置。要求你写一个程序可以解决所有这样的问题。

输入描述

第一行输入一个t,表示有t(1<=t<=10)组样例。

接下来有t组,每组输入两个字符串a和b,1<=|a|<=1000000, 1<=|b|<=1000000。

输出描述

对于每个样例,如果b串不是回文串输出一行"NO",否则输出一行"YES",并输出一个数m,表示b串在a串中出现了几次,接下来输出m行,按起始位置的字典序由小到大输出b串在a串出现的起始位置和终点位置。每个样例之间有一个空行。

样例输入

3
abbbabbbabbb
a
abba
abc
aaaa
aa

样例输出

YES
3
1 1
5 5
9 9

NO

YES
3
1 2
2 3
3 4

思路

当时比赛时,自己也看出了KMP,但是太菜了,kmp板子题都没有过。

1.我们设s是模式串,m是模式串的长度,p是模板串,n是模板串的长度,ne[]是next数组,字符串的下标从1开始
2.首先判断p是否为回文串,直接两个指针,index1从前往后,index2从后往前,只要遇到不相等的就退出,说明不是回文串。
3.接下来就看KMP,我的板子是下标从1开始,先求出ne数组(前后缀重合最大),然后开始模式串与模板串的匹配,每次匹配成功后,就将首尾加入vector中,然后遍历完s串后,vector的长度就是出现的个数
4.最后注意输出的下标,还有就是输出后要空一行

AC代码

#include<bits/stdc++.h>

using namespace std;
const int N = 1e6 + 10;
typedef pair<int, int> PII;
int t, m, n;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值