E. Archaeology(思维)

看了题解又觉得自己好傻币

相信你马上也会觉得自己很傻逼的

a , b , c , 原串只含有a,b,c,且相邻字母不相等

, 那我从开头取连续的两个字母,末尾取两个连续字母

4 , 4个字母,一定会有两个字母相等

, 那我们取两个,丢掉两个

4 , 取到最后如果不足4个字母,任取一个作为回文串的中心

这样保证了一定大于等于向下取整的串长一半

#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+10; 
int vis[maxn];
char s[maxn];
int main()
{
	scanf("%s",s+1);
	int l=1,r=strlen(s+1),x=0,len=strlen(s+1);
	while( 1 )
	{
		if( r-l+1<4 )
		{
			if( r>l )	x=l+1;
			break;
		}
		if( s[l]==s[r] )
		{
			vis[l]=vis[r]=1;
			l++,r--;
		}
		else if( s[l+1]==s[r] )
		{
			vis[l+1]=vis[r]=1;
			l+=2,r--;
		}
		else if( s[l]==s[r-1] )
		{
			vis[l]=vis[r-1]=1;
			l++,r-=2;
		}
		else if( s[l+1]==s[r-1] )
		{
			vis[l+1]=vis[r-1]=1;
			l+=2,r-=2;
		}
	}
	for(int i=1;i<=len;i++)
	{
		if( x!=0&&i>=x )	x=0,cout << s[i];
		if( vis[i] )	putchar(s[i]);
	}
}

猜你喜欢

转载自blog.csdn.net/jziwjxjd/article/details/107736160