字符串HASH +搜索
str[j]=str[j-1]*seed+"str[j]"
#include <iostream>
#include <cstdio>
#include <cstring>
#define ULL unsigned long long
using namespace std;
ULL str[9][100010];
char s[100100];
#define seed 107
//#define M 100007771
int n,m;
int ans[100100];
int ks,ke;
int size;
ULL HH[100010];
bool dfs(int l,int k,ULL hash,int deep){
//ans[k]=l/2*n+((l&1)?n-p+1:p);
if(n+k>=m){
for(int i=0;i<8;i++){
if(i==(l^1))continue;
int q=m-k;
ULL ss=hash*HH[q]+str[i][q];
//printf("l=%d,p=%d,k=%d,flag=%d\n",l,p,k,flag);
if(ss==str[8][m]){
ans[deep]=i;
size=deep+1;
ke=q;
return true;
}
}
return false;
}
for(int i=0;i<8;i++){
ans[deep]=i;
if(hash*HH[n]+str[i][n]!=str[8][k+n])continue;
if(i!=(l^1)&&dfs(i,k+n,hash*HH[n]+str[i][n],deep+1)) return true;
}
return false;
}
bool solve(){
for(int i=0;i<8;i++){
for(int k=1;k<=n;k++){
size=0;
if(m>n-k+1){
size=0;
ks=k;
ans[0]=i;
if(dfs(i,n-k+1,str[i][n]-str[i][k-1]*HH[n-k+1],1))return true;
}
else
{
size=0;
int ss=k+m-1;
ks=k;
ke=ss;
ans[0]=i;
if(str[i][ss]-str[i][k-1]*HH[m]==str[8][m])
return true;
}
}
}
return false;
}
int main(){
int t;
scanf("%d",&t);
HH[0]=1;
for(int i=1;i<=100000;i++)HH[i]=HH[i-1]*seed;
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<4;i++){
scanf("%s",s+1);
str[i*2][0]=0;
str[i*2+1][0]=0;
for(int j=1;j<=n;j++){
str[i*2][j]=str[i*2][j-1]*seed+s[j]-'a'+1;
str[i*2+1][j]=str[i*2+1][j-1]*seed+s[n-j+1]-'a'+1;
}
}
str[8][0]=0;
scanf("%s",s+1);
for(int j=1;j<=m;j++){
str[8][j]=str[8][j-1]*seed+s[j]-'a'+1;
}
if(solve()){
if(size==1){
for(int i=ks;i<=ke;i++){
printf("%d%s",ans[0]/2*n+((ans[0]&1)?(n-i+1):i),i==ke?"\n":" ");
}
}
else if(size==2){
for(int i=ks;i<=n;i++){
printf("%d ",ans[0]/2*n+((ans[0]&1)?(n-i+1):i));
}
for(int i=1;i<=ke;i++)
printf("%d%s",ans[1]/2*n+((ans[1]&1)?(n-i+1):i),i==ke?"\n":" ");
}
else{
for(int i=ks;i<=n;i++){
printf("%d ",ans[0]/2*n+((ans[0]&1)?(n-i+1):i));
}
for(int i=1;i<=size-2;i++){
for(int j=1;j<=n;j++){
printf("%d ",ans[i]/2*n+((ans[i]&1)?(n-j+1):j));
}
}
size--;
for(int i=1;i<=ke;i++)
printf("%d%s",ans[size]/2*n+((ans[size]&1)?(n-i+1):i),i==ke?"\n":" ");
}
}
else{
printf("No solution!\n");
}
}
}