FZU 2122 ——又见LKity——————KMP字符串匹配

Posted tc_goshawk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FZU 2122 ——又见LKity——————KMP字符串匹配相关的知识,希望对你有一定的参考价值。

 

Problem 2122 又见LKity

Accept: 413    Submit: 1425
Time Limit: 1000 mSec    Memory Limit : 32768 KB

技术分享 Problem Description

嗨!大家好,在TempleRun中大家都认识我了吧。我是又笨又穷的猫猫LKity。很高兴这次又与各位FZU的ACMer见面了。最近见到FZU的各位ACMer都在刻苦地集训,整天在日光浴中闲得发慌的我压力山大呀!于是,我准备为诸位编写一款小工具——LKity牌文本替换(众怒,:敢不敢更土点!)。这个小工具可以帮助诸位替换代码中的变量等功能,真心是一款编程,刷题必备的神器。其功能如下:

将给定的字符序列中所有包含给定的子串替换成另外一个给定的字符串。为了让其功能更加强大,替换过程中,将忽略大小写。并且不进行递归替换操作。

不过,作为笨笨的猫猫,我是心有余而力不足呀!希望诸位ACMer能帮我实现哈。(众FZU的ACMer:”……”);

技术分享 Input

输入包含多组数据。 输入为标准输入,输入包含3行。 第一行为需要查找的字符串S1。S1仅由大写或者小写字母组成,且其长度在区间[1,,100]内。 第二行为要替换的字符串S2。S2由[32,125]的字符组成,且其长度在区间[1,100]内。 第三行为原始字符串S,S由[32,125]的字符组成。且其长度在区间[1,50,000]内。

技术分享 Output

对于每组数据,请输出替换后的字符串。

技术分享 Sample Input

abc
bc ab
aaa aaabca 333Abcc##

技术分享 Sample Output

aaa aabc aba 333bc abc##

技术分享 Source

福州大学第十届程序设计竞赛

 

解题思路:判断字符相等的地方处理一下。再者就是当匹配失败时候要回退j指针,回退j时要把txt前面已经失效的一段字符输出来,比如前面匹配上k个字符,这次回退后只能匹配上j个字符,那么就要把前面失效的k-j个字符输出来。

 

 

#include<stdio.h>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<string>
using namespace std;
const int maxn = 1e5+200;
char p[1020],txt[maxn],rpl[1020];
int lenp, lenr, lent, fail[1020];
bool jud(char a, char b){
    if(a == b){
        return true;
    }else{
        if(a>=‘a‘&&a<=‘z‘){
            if(b>=‘A‘&&b<=‘Z‘){
                if(a-32 == b)
                return true;
            }
        }
        if(a>=‘A‘&&a<=‘Z‘){
            if(b>=‘a‘&&b<=‘z‘){
                if(a+32 == b)
                    return true;
            }
        }
    }
    return false;
}
void getfail(){
    fail[0] = fail[1] = 0;
    int i, j;
    for(i = 1; i < lenp; i++){
        j = fail[i];
        while(j && (!jud(p[i],p[j]))) j = fail[j];
        fail[i+1] = jud(p[i],p[j]) ? j+1:0;
    }
}
void kmp(){
    int i, j = 0, k;
    for(int i = 0; i < lent; i++){
        if(!jud(txt[i],p[j])){
            k = j;
        }
        while(!jud(txt[i],p[j])){
            if(j){
                j = fail[j];
            }
            else break;
            for(int kk = i-k; kk < i-k+k-j; kk++){
                printf("%c",txt[kk]);
            }
            k = j;
        }
        if(jud(p[j],txt[i])) j++;
        else{
            printf("%c",txt[i]);
        }
        if(j == lenp){
            for(k = 0; k < lenr; k++){
                printf("%c",rpl[k]);
                j = 0;
            }
        }
    }
    for(k = lent-j; k < lent; k++){
        printf("%c",txt[k]);
    }puts("");
}
int main(){
    while(gets(p)!=NULL){
        gets(rpl);
        gets(txt);
        lenp = strlen(p);
        lenr = strlen(rpl);
        lent = strlen(txt);
        getfail();
        kmp();
    }
    return 0;
}

/*
ababd
kk
ababcd

aab
kk
AAAB

aab
kk
abaa

*/

  

以上是关于FZU 2122 ——又见LKity——————KMP字符串匹配的主要内容,如果未能解决你的问题,请参考以下文章

FZU 2122——又见LKity——————字符串匹配暴力

FZU 2122 ——又见LKity——————KMP字符串匹配

FZU 2122 又见LKity字符串/正难则反/KMP/把一个字符串中某个部分替换为另一个部分

HDU2504 又见GCD

杭电2504 又见GCD

HDU 2054 又见GCD(水题??)