#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;
} 

posted @ 2025-11-11 21:22  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源