题目描述
PIPI又来考察大家字符串处理的能力了。
给定一个字符串S,以及字符串T,你需要回答:
(1)T是否是S的子串。如果是输出YES,并回答问题(2);如果不是,输出NO。
(2)T作为S的子串在S中出现了几次?
请你来解决这个简单的问题。
注意:子串不是子序列。子串要求连续,如”abc"为"aabcc“的子串。
输入
第一行给出字符串S。|S|<=1e6.
第二行给出字符串T。|T|<=1e6.
输出
首先回答问题(1),若T为S子串,输出YES,第二行回答问题(2).若不是,直接输出NO。
样例输入
abcabcabc
bc
样例输出
YES
3
题解代码如下
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+7,P = 131;
typedef unsigned long long ull;
ull p[N],h[N],h1;
char str[N],str1[N];
ull get(int l,int r){
return h[r] - h[l-1] * p[r-l+1];
}
int main(){
scanf("%s%s",str+1,str1+1);
int n = strlen(str+1);
int m = strlen(str1+1);
p[0] = 1;
for (int i=1;i<=n;i++){
p[i] = p[i-1] * P;
h[i] = h[i-1] * P + str[i];
}
for(int i=1;i<=m;i++){
h1 = h1 * P + str1[i];
}
int cnt = 0;
for(int i=m;i<=n;i++){
if(get(i-m+1,i)==h1) cnt++;
}
if(cnt==0) puts("NO");
else{
puts("YES");
printf("%d",cnt);
}
return 0;
}