luogu在线IDE上测试的没有问题,但是CF上就在第三个样例RE,呜呜呜
#include<iostream>
#include<cstdio>
#include<cmath>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define maxn 100010
#define inf 0x7f7f7f7f
#define mod 898244363
#define int long long
#define re register
#define base 7907
inline int read();
inline void wn(int x);
inline void wr(int x);
inline void wi(int x);
int n,m;
int h[4][maxn];
int ans;
string a[maxn];
bool vis[maxn];
vector<int>v[10];
signed main()
{
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
// printf("%d M\n",((sizeof(z))>>20));
n=read(),m=read();
// wi(n),wr(m);
for(re int i=1;i<=n;++i)
{
cin>>a[i];
// cout<<a<<endl;
for(re int j=0;j<m;++j) h[1][i]=(h[1][i]*base%mod+a[i][j]-'a'+1)%mod;
for(re int j=m-1;j>=0;--j) h[2][i]=(h[2][i]*base%mod+a[i][j]-'a'+1)%mod;
}
string b="";
for(re int i=1;i<=n;++i)
if(h[1][i]==h[2][i])
{
ans=m;
b=a[i];
vis[i]=true;
break;
}
for(re int i=1;i<=n;++i)
{
if(vis[i]) continue;
for(re int j=i+1;j<=n;++j)
{
if(vis[j]) continue;
if(h[1][i]==h[2][j])
{
ans+=(m+m);
vis[i]=vis[j]=true;
v[0].push_back(i);
v[1].push_back(j);
}
}
}
wr(ans);
int le=v[0].size()-1;
if(le<0) return 0;
for(re int i=0;i<=le;++i) cout<<a[v[0][i]];
cout<<b;
int len=v[1].size()-1;
if(len<0) return 0;
for(re int i=len;i>=0;--i) cout<<a[v[1][i]];
return 0;
}
//==========================================================
inline int read()
{
int f=1,x=0;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return x*f;
}
inline void wn(int x)
{
if(x<0)
{
putchar('-');
wn(-x);
return ;
}
if(x>=10) wn(x/10);
putchar('0'+x%10);
}
inline void wr(int x)
{
wn(x);
putchar('\n');
}
inline void wi(int x)
{
wn(x);
putchar(' ');
}