/*
ID :jinbo wu
TASK:charrec
LANG:C++
*/
#include<bits/stdc++.h>
using namespace std;
string f1[550],f2[1250];
int mi[1250][4],n1,n2;
int mat[1250][550];
string ss[1250];
char ans[1250][4];
int f[1250];
string str=" abcdefghijklmnopqrstuvwxyz";
void read()
{
freopen("font.in","r",stdin);
cin>>n1;
for(int i=1;i<=n1;i++)
cin>>f1[i];
fclose(stdin);
}
int match(int a,int b)
{
int cnt=0;
for(int i=0;i<20;i++)
if(f1[a][i]!=f2[b][i])
cnt++;
return cnt;
}
int main()
{
read();
freopen("charrec.in","r",stdin);
freopen("charrec.out","w",stdout);
cin>>n2;
for(int i=1;i<=n2;i++)
cin>>f2[i];
for(int i=1;i<=n1;i++)
{
for(int j=1;j<=n2;j++)
mat[j][i]=match(i,j);
}
memset(mi,0x3f,sizeof(mi));
for(int i=1;i<=n1;i+=20)
{
for(int j=1;j<=n2;j++)
{
if(j+19<=n2)
{
int tmp=0;
for(int l=0;l<20;l++)
tmp+=mat[j+l][i+l];
if(tmp<mi[j][0])
{
mi[j][0]=tmp;
ans[j][0]=tmp>120? '?':str[i/20];
}
}
for(int k=1;k<=21;k++)
{
if(j+18<=n2&&k<21)
{
int tmp=0;
for(int l=0;l<k-1;l++)
tmp+=mat[j+l][i+l];
for(int l=k-1;l<19;l++)
tmp+=mat[j+l][i+l+1];
if(tmp<mi[j][1])
{
mi[j][1]=tmp;
ans[j][1]=tmp>120?'?':str[i/20];
}
}
if(j+20<=n2)
{
int tmp=0;
for(int l=0;l<k-1;l++)
tmp+=mat[j+l][i+l];
for(int l=k-1;l<21;l++)
tmp+=mat[j+l+1][i+l];
if(tmp<mi[j][2])
{
mi[j][2]=tmp;
ans[j][2]=tmp>120?'?':str[i/20];
}
}
}
}
}
f[0]=0;
ss[0]="";
for(int i=1;i<19;i++)
{
f[i]=121;
ss[i]='?';
}
for(int i=19;i<=n2;i++)
{
f[i]=f[i-19]+mi[i-18][1];
ss[i]=ss[i-19]+ans[i-18][1];
if(i>19&&f[i]>mi[i-19][0]+f[i-20])
{
f[i]=f[i-20]+mi[i-19][0];
ss[i]=ss[i-20]+ans[i-19][0];
}
if(i>20&&f[i]>f[i-21]+mi[i-20][2])
{
f[i]=f[i-21]+mi[i-20][2];
ss[i]=ss[i-21]+ans[i-20][2];
}
}
cout<<ss[n2]<<endl;
}
这题题目都读了我好长时间,还看了好长时间题解只能说有一点点懂先留着以后再慢慢看