#P5636. Pku3461 Oulipo题解
Description
给定一个主串和一个模式串,要求计算模式串在主串中出现的次数。字符串长度不超过 106106。
Input
第一行给出测试组数 TT,表示接下来有 TT 组数据。
每组数据包含两行:
- 第一行为模式串。
- 第二行为主串。
Output
对于每组数据,输出模式串在主串中出现的次数。
输入数据 1
3
BAPC
BAPC
AZA
AZAZAZA
VERDI
AVERDXIVYERDIAN
输出数据 1
1
3
0
Explanation
- 在第一组数据中,模式串
BAPC在主串BAPC中出现了 11 次。 - 在第二组数据中,模式串
AZA在主串AZAZAZA中出现了 33 次(重叠部分也算)。 - 在第三组数据中,模式串
VERDI在主串AVERDXIVYERDIAN中未出现,因此输出 00。
思路
kmp
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,kmp[1000006],as,bs,op=0;
char a[1000006],b[1000006];
int main(){
cin>>t;
while(t--){
cin>>b+1;
cin>>a+1;
op=0;
as=strlen(a+1);
bs=strlen(b+1);
for(int i=2,j=0;i<=bs;i++){
while(j!=0&&b[i]!=b[j+1]){
j=kmp[j];
}
if(b[j+1]==b[i]){
j++;
}
kmp[i]=j;
}
for(int i=1,j=0;i<=as;i++){
while(j!=0&&a[i]!=b[j+1]){
j=kmp[j];
}
if(b[j+1]==a[i]){
j++;
}
if(j==bs){
op++;
j=kmp[j];
}
}
for(int i=0;i<=max(as,bs)+1;i++){
kmp[i]=0;
a[i]=b[i]=' ';
}
cout<<op<<endl;
}
return 0;
}

浙公网安备 33010602011771号