CQU 单词替换(KMP)

单词替换(KMP)

Time Limit: 500 MS Memory Limit: 64000 K

Description

给出一个仅包含小写字母的字符串s,和单词A,B。把s中所有的出现过的A替换为B。

Input

第一行一个数T(1<=T<=10),表示数据组数

每组数据三行,第一行为s,第二行为A,第三行为B。所有字符串仅包含小写字母

且长度小于5,000,000。

Output

每组数据输出一行,替换后的字符串。

Sample Input

3

aaa

a

b

aaa

aa

b

ababa

aba

cd

Sample Output

bbb

ba

cdba

题意:

如上所示,就是一个裸的kmp嘛。。

分析:

在kmp基础上加一个替换的工作。

在母串中找到一个子串时,标记下这个子串在母串中的起始位置。最后扫一遍母串,按序输出,遇到标记则输出B串。

代码:

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=5e6+5;
int T,ans;
int nxt[maxn];
char s[maxn],A[maxn],B[maxn];
bool flag[maxn];
void kmp(){
    int i,j,k,m,n,p;
    n=strlen(s);m=strlen(A);
    j=nxt[0]=-1;i=0;
    while(i<m){
        if(j==-1|| A[i]==A[j])
            nxt[++i]=++j;
        else j=nxt[j];
    }
    p=i=ans=0;
    while(i<n && p<m){
        if(s[i]==A[p] || p==-1){
            p++;
            i++;
        }
        else p=nxt[p];
        if(p==m){
            ans++;
            p=nxt[p];
            flag[i-m]=true;
        }
    }
    // cout<<flag[0]<<endl;
    for(int i=0;i<n;i++)
        if(flag[i]) {printf("%s",B); i+=m-1;}
        else printf("%c",s[i]);
        printf("\n");
}

int main(){
    freopen("in.txt","r",stdin);
    scanf("%d",&T);
    while(T--){
        scanf("%s\n",s);
        scanf("%s\n",A);
        scanf("%s\n",B);
        memset(flag,false,sizeof flag);
        kmp();
    }
}
时间: 2024-08-02 06:39:19

CQU 单词替换(KMP)的相关文章

LUA实现单词替换功能

背景描述 编程或者文档处理过程, 经常遇到需要将一个单词修改为另外一个单词的情况, 例如 命名为 shall 修改 为 should. 使用工具实现, 则比较方便,不容易出错, 解放双手. 需求规格 对于某个文件夹中的所有文本文件(txt), 将某个单词替换为目标单词. 实现思路 对于替换的单词映射, 在配置文件config.lua进行设置, 存储一个表,表中每一行 对应  src vocanbulary 和 dest vocanbulary 对应工具的主题逻辑代码在 replace.lua中实

AC日记——单词替换 1.7 21

21:单词替换 总时间限制:  1000ms 内存限制:  65536kB 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入 输入包括3行,第1行是包含多个单词的字符串 s;第2行是待替换的单词a(长度 <= 100);第3行是a将被替换的单词b(长度 <= 100). s, a, b 最前面和最后面都没有空格. 输出 输出只有 1 行,将

【九度OJ】题目1111:单词替换

题目1111:单词替换 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b 最前面和最后面都没有空格. 输出: 每个测试数据输出只有 1 行, 将s中所有单词

九度 题目1111:单词替换

题目1111:单词替换 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4068 解决:1153 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b

poj2944:单词替换

好几天没更了,这几天先是刚搬完砖,玩了一整天,接着乘火车回家,所以没做题.然后今晚做了这道简单题,最开始还WA了好几次,卧槽... 怒了直接推倒重写... 下面是题目 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入 输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,

题目1111:单词替换(字符串查找)

题目链接:http://ac.jobdu.com/problem.php?pid=1168 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1111 单词替换.cpp // Jobdu // // Created by PengFei_Zheng on 26/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio

九度oj 题目1111:单词替换

题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b 最前面和最后面都没有空格. 输出: 每个测试数据输出只有 1 行, 将s中所有单词a替换成b之后的字符串.

题目1111:单词替换

题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b 最前面和最后面都没有空格. 输出: 每个测试数据输出只有 1 行, 将s中所有单词a替换成b之后的字符串.

九度OJ1111题-单词替换

题目1111:单词替换 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6752 解决:1891 题目描述: 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串. 输入: 多组数据.每组数据输入包括3行, 第1行是包含多个单词的字符串 s, 第2行是待替换的单词a,(长度<=100) 第3行是a将被替换的单词b.(长度<=100) s, a, b