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

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

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

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

4 个 字 母 , 一 定 会 有 两 个 字 母 相 等 4个字母,一定会有两个字母相等 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]);
}
}