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题

