单词替换 KMP 简单应用

来源:互联网 发布:当代大学生创业数据 编辑:程序博客网 时间:2024/06/06 01:35
【题意】
给出一个仅包含小写字母的字符串s,和单词A,B。把s中所有的出现过的A替换为B。

【解题思路】简单KMP算法的应用,每一个匹配的地方注意输出替换后的字符串就可以了。

【补充】

Sample Input

3aaaabaaaaabababaabacd

Sample Output

bbbbacdba
【AC代码】

#include <stdio.h>#include <string.h>#include <iostream>using namespace std;const int maxn=500010;char s[maxn],t[maxn],b[maxn];int nxt[maxn];void kmp_pre(){    memset(nxt,0,sizeof(nxt));    int j=0,m=strlen(t+1);    for(int i=2; i<=m; i++){        while(j>0&&t[j+1]!=t[i]) j=nxt[j];        if(t[j+1]==t[i])         j++;        nxt[i]=j;    }}void kmp(){    int j=0,n=strlen(s+1),m=strlen(t+1);    int last=1;    for(int i=1; i<=n; i++){        while(j>0&&t[j+1]!=s[i]) j=nxt[j];        if(t[j+1]==s[i])         j++;        if(j==m){//            printf("match success!\n");            j=0;            for(int k=last; k<=i-m; k++) printf("%c",s[k]);            printf("%s",b+1);            last=i+1;        }    }    for(int i=last; i<=n; i++)printf("%c",s[i]);}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%s",s+1);        scanf("%s",t+1);        scanf("%s",b+1);        kmp_pre();        kmp();        printf("\n");    }    return 0;}


0 0
原创粉丝点击