FZU2122_又见LKity

题目是说给你一个替换串和目标串。把一个长串中的所有的替换串替换为目标串而且不递归地替换。

很简单,直接做一次KMP然后直接替换。

注意替换后跳到替换串的尾部。

注意大小写的问题。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 50550
using namespace std;

char s0[111],s1[111],s[maxn];
int f[111],L;
bool tag[maxn];
int n,m;

bool equal(char c1,char c2)
{
    if (c1==c2) return true;
    if (c1>c2) swap(c1,c2);
    c1=c1-'A'+'a';
    if (c1==c2) return true;
    return false;
}

void getfail()
{
    memset(f,0,sizeof f);
    f[1]=0;
    for (int i=2; s0[i]; i++)
    {
        int k=f[i-1];
        while (k && equal(s0[k+1],s0[i])==false) k=f[k];
        if (equal(s0[k+1],s0[i])) f[i]=k+1;
            else f[i]=0;
    }
}

void trans(char ss[])
{
    for (int i=0; ss[i]; i++)
    {
        if (ss[i]>='A' && ss[i]<='Z') ss[i]=ss[i]-'A'+'a';
    }
}

int main()
{
    while (gets(s0+1))
    {
        gets(s1+1),gets(s+1);
        getfail();
        L=strlen(s0+1);
        memset(tag,false,sizeof tag);
        int cur=0;
        for (int i=1; s[i]; i++)
        {
            if (equal(s0[cur+1],s[i])) cur++;
            else
            {
                int k=f[cur];
                while (k && equal(s0[k+1],s[i])==false) k=f[k];
                if (equal(s0[k+1],s[i])) cur=k+1;
                    else cur=0;
            }
            if (cur==L)
            {
                tag[i]=true;
                cur=0;
            }
        }
        for (int i=1; s[i]; i++)
        {
            if (tag[i+L-1]==true)
            {
                printf("%s",s1+1);
                i=i+L-1;
            }
            else  printf("%c",s[i]);
        }
        printf("\n");
    }
    return 0;
}

 

posted @ 2013-11-20 17:03  092000  阅读(445)  评论(0编辑  收藏  举报