萌新求助玄学RE
查看原帖
萌新求助玄学RE
538699
蜜雪冰城楼主2021/11/3 17:32

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(' ');
}


2021/11/3 17:32
加载中...