福州大学第十届程序设计竞赛_又见LKity(KMP+大小写字母转化)

Title:

嗨!大家好,在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##

思路:

    字符是否相等------>((int)str1[i] | 32) == ((int)str2[j]|32)

代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

char s1[105],s2[126],s3[50050],s4[50050*126];
int next[105];

void getnext()
{
    int len = strlen(s1);
    next[0] = 0;
    int k = 0;
    for(int i=1; i<len; i++)
    {
        while(k>0 && ((int)s1[i]|32)!=((int)s1[k]|32))
            k = next[k-1];
        if(s1[i] == s1[k])
            k++;
        next[i] = k;
    }
}

void KMP()
{
    int len1 = strlen(s1);
    int len3 = strlen(s3);
    int len2 = strlen(s2);
    int j=0,s4sign=0;
    for(int i=0; i<len3; i++)
    {
        while(j>0 && ((int)s3[i]|32) != ((int)s1[j]|32))
            j = next[j-1];
        if(((int)s3[i]|32) == ((int)s1[j]|32))
            j++;

        if(j == len1)
        {
            s4sign = s4sign - len1+1;
            for(int p=0; p<len2; p++,s4sign++)
                s4[s4sign] = s2[p];
            j=0;
        }
        else
            s4[s4sign++] = s3[i];
    }
    s4[s4sign] = '\0';
    puts(s4);
}


int main()
{
    while(gets(s1)!=NULL)
    {
        gets(s2);
        gets(s3);
        getnext();
        KMP();
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/ZJWSA/article/details/81666712