HDU/HDOJ----4300 Clairewd’s message

多校联合赛第一场,只做出来这么一道水题,惭愧惭愧……

用‘*’把原串补的足够长(模式串2倍),然后用一个小小改动的KMP。

#include <iostream>
#include <cstring>
#include <cstdio>

#define N 100005

using namespace std;

char biao[30],ch[30],str[N],s1[N],s2[2*N];
int fail[N];

int kmp(char *str,char *pat){
    int i,j,k;
    memset(fail,-1,sizeof(fail));
    for(i=1;pat[i];i++){
        for(k=fail[i-1];k>=0&&pat[i]!=pat[k+1];k=fail[k]);
        if(pat[k+1]==pat[i]) fail[i]=k+1;
    }

    i=j=0;
    while(str[i]&&pat[j]){
        if(pat[j]==str[i]||str[i]=='*') ++i,++j;
        else if(j==0) ++i;
        else j=fail[j-1]+1;
    }
    if(pat[j]) return -1;
    return i-j;
}

int main(){
    //freopen("in.in","r",stdin);
    int T,s,t,i,j;
    scanf("%d",&T);
    while(T--){
        scanf("%s%s",biao,str);
        for(i=0;biao[i];i++)
            ch[biao[i]-'a']='a'+i;
        int len=strlen(str);
        if(len%2) s=(len+1)/2;
        else s=len/2;
        //cout<<"s="<<s<<endl;
        for(i=0;i<s;i++)
            s1[i]=ch[str[i]-'a'];
        s1[i]=0;
        for(i=0;str[i+s];i++)
            s2[i]=str[i+s];
        for(;i<2*len;i++)
            s2[i]='*';
        //cout<<s1<<' '<<s2<<endl;
        int t=s+kmp(s2,s1);
        //cout<<"t="<<t<<endl;
        for(i=0;i<t;i++)
            printf("%c",str[i]);
        for(i=0;i<t;i++)
            printf("%c",ch[str[i]-'a']);
        printf("\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值