2021算法竞赛入门班第十节课字符串练习题

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021算法竞赛入门班第十节课字符串练习题相关的知识,希望对你有一定的参考价值。

救救企鹅【KMP】


https://ac.nowcoder.com/acm/problem/20862
KMP匹配,记录匹配的开始下标。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
char s[N],a[N],b[N];
int ne[N],n,m;
unordered_map<int,int>mp;
int main(void)

    cin>>s+1>>a+1>>b+1;
    int n=strlen(a+1),m=strlen(s+1);
    for(int i=2,j=0;i<=n;i++)
    
        while(j&&a[i]!=a[j+1]) j=ne[j];
        if(a[i]==a[j+1]) j++;
        ne[i]=j;
    
    for(int i=1,j=0;i<=m;i++)
    
        while(j&&s[i]!=a[j+1]) j=ne[j];
        if(s[i]==a[j+1]) j++;
        if(j==n) mp[i-n+1]=1;//匹配了记录最开始匹配的下标
    
   	for(int i=1;i<=m;i++)
   	
   		if(mp[i]) cout<<b+1,i=i+n-1;//替换
   		else cout<<s[i];
   	
    return 0;

以上是关于2021算法竞赛入门班第十节课字符串练习题的主要内容,如果未能解决你的问题,请参考以下文章

2021算法竞赛入门班第七节课图论练习题

2021算法竞赛入门班第九节课线段树练习题

2021算法竞赛入门班第八节课数学习题

2021算法竞赛入门班第二节课递归分治二分练习题

2021算法竞赛入门班第一节课枚举贪心习题

2021算法竞赛入门班第三节课堆栈队列并查集等习题