原题链接
题意
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;