E. No Palindromes

pure4knowledge / 2024-07-18 / 原文

原题链接

题解

1.判断整体是不是回文串

2.如果是,找第一个与 \(s_1\) 不同的字符 \(s_i\),如果 \(s[i+1,n]\) 是回文串,代表 \(s\) 一定长这样 \(AbAb....AbA\)

3.如果 \(A\) 的长度为一,或者 \(b\) 只出现一次,容易想到没有分割方法

4.不然可以 \(Abaaa...,...aaabAbAbA\)

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;

void solve()
{
    string s;
    cin>>s;

    int len=s.size();

    int flag=0;
    int it=len;
    for(int i=0;i<len;i++)
    {
        if(s[i]!=s[len-i-1]) flag=1;
        if(s[i]!=s[0])
        {
            it=min(it,i);
        }
    }
    if(flag)
    {
        cout<<"YES\n1\n"<<s<<'\n';
        return;
    }
    if(it==len)
    {
        cout<<"NO\n";
        return;
    }

    flag=0;
    for(int i=it+1;i<len;i++)
    {
        if(s[i]!=s[len-(i-it)]) flag=1;
    }
    if(flag)
    {
        cout<<"YES\n2\n"<<s.substr(0,it+1)<<" "<<s.substr(it+1)<<'\n';
    }
    else
    {
        if(it==1||2*it+1==len)
        {
            cout<<"NO\n";
        }
        else
        {
            cout<<"YES\n2\n"<<s.substr(0,it+2)<<" "<<s.substr(it+2)<<'\n';
        }
    }
}
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t=1;
    cin>>t;
    while(t--) solve();
    return 0;
}