题目:点击打开链接
题意:裸的EKMP
#include <iostream>
#include <vector>
#include<map>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<string>
using namespace std;
#define MAXN 1000010
int next[MAXN],extend[MAXN];
void pre_ekmp(char x[],int m){
next[0]=m;
int j=0;
while (j+1<m&&x[j]==x[j+1]) j++;
next[1]=j;
int k=1;
for(int i=2;i<m;i++){
int p=next[k]+k-1;
int l=next[i-k];
if(i+l<p+1) next[i]=l;
else {
j=max(0,p-i+1);
while (i+j<m&&x[i+j]==x[j])j++;
next[i]=j;
k=i;
}
}
}
void ekmp(char x[],int m,char y[],int n){
pre_ekmp(x,m);
int j=0;
while (j<n&&j<m&&x[j]==y[j])j++;
extend[0]=j;
int k=0;
for(int i=1;i<n;i++){
int p=extend[k]+k-1;
int l=next[i-k];
if(i+l<p+1)extend[i]=l;
else {
j=max(0,p-i+1);
while (i+j<n&&j<m&&y[i+j]==x[j])j++;
extend[i]=j;
k=i;
}
}
}
char data[MAXN],tp[MAXN],ys[27],w_r[27];;
void get_ys(){
for(int i=0;i<26;i++){
w_r[ys[i]-'a']='a'+i;
}
}
int main(){
int T;
//freopen("data.in","r",stdin);
scanf("%d",&T);
while (T--){
scanf("%s",ys);
scanf("%s",data);
get_ys();
int len=strlen(data);
for(int i=0;i<(len+1)/2;i++){
tp[i]=w_r[data[i]-'a'];
}
for(int i=(len+1)/2;i<len;i++){
tp[i]=data[i];
}
ekmp(tp,len,tp,len);
int st;
for(int i=(len+1)/2;i<=len;i++){
if(i+extend[i]==len) {
st=i;
break;
}
}
for(int i=0;i<st;i++){
data[i+st]=w_r[data[i]-'a'];
}
data[st*2]='\0';
printf("%s\n",data);
}
return 0;
}