Clairewd’s message HDU - 4300

这题用扩展kmp或者hash都可以做
我是用的hash
但是或者扩展kmp更方便一点?
这种题,字符串颠来倒去的比较绕。但是其实是不难的

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ull,ull> pull;
const int max_n = 1e5+100;
struct My_Hash{
    ull base = 131;
    ull mm0=1e9+7,mm1=1e9+9;
    ull p0[max_n],p1[max_n];
    ull ha0[max_n],ha1[max_n];
    void Insert(char s[]){
        int n = strlen(s+1);
        p0[0]=p1[0]=1;
        ha0[0]=ha1[0]=0;
        for (int i=1;i<=n;++i){
            p0[i]=p0[i-1]*base%mm0;
            p1[i]=p1[i-1]*base%mm1;
            ha0[i]=(ha0[i-1]*base%mm0+s[i])%mm0;
            ha1[i]=(ha1[i-1]*base%mm1+s[i])%mm1;
        }
    }
    pull gethash(int l, int r){
        ull ans0 = (ha0[r]-ha0[l-1]*p0[r-l+1]%mm0+mm0)%mm0;
        ull ans1 = (ha1[r]-ha1[l-1]*p1[r-l+1]%mm1+mm1)%mm1;
        return pull(ans0,ans1);
    }
}S0,S1;
char table[30];
char text[max_n];
char txt[max_n];
int n;
char revtable[30];

int main(){
    int T;scanf("%d",&T);
    while (T--){
        scanf("%s",table);
        for (int i=0;i<26;++i)revtable[table[i]-'a']=(char)('a'+i);
        scanf("%s",text+1);
        n=strlen(text+1);
        for (int i=1;i<=n;++i)txt[i]=table[text[i]-'a'];
        txt[n+1]='\0';
        S0.Insert(text);S1.Insert(txt);
        int l=1,r=n;
        for (int i=(n+1)/2+1;i<=n;++i){
            if (S1.gethash(i,n)==S0.gethash(1,n-i+1)){
                l = n-i+2;r = i-1;
                break;
            }
        }
        printf("%s",text+1);
        for (int i=l;i<=r;++i)printf("%c",revtable[text[i]-'a']);
        puts("");
    }
}
Kuangbin题单详解(kmpManacher) 文章被收录于专栏

刷Kuangbin题

全部评论

相关推荐

想去夏威夷的小哥哥在度假:5和6才是重点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务