Balls of Buma(回文串)

Balph正在学习玩名为Buma的游戏。在这个游戏中,给他一行彩球。他必须选择一个新球的颜色和插入它的位置(在两个球之间,或者在所有球的左边,或者在所有球的右边)。
当插入球时,会重复发生以下情况:如果由于先前的动作,相同颜色的球部分变得更长,并且其长度至少变为3,则该部分的所有球都将被消除。
例如,考虑一排“ AAABBBWWBB”球。假设Balph选择了一个颜色为“ W”的球,并将其插入第六个球i之后的位置。 e。在两个“ W”的左侧Balph插入该球后,将消除颜色为“ W”的球,因为该线段已变长并且现在的长度为3,所以该行变为“ AAABBBBB”。现在消除了颜色“ B”的球,因为颜色“ B”的球段变长了,现在长度为5。因此,该行变为“ AAA”。但是,现在没有任何一个球被消除,因为没有细长段。
帮助Balph数出选择新球的颜色以及将其插入的地方可以消除所有球的可能性的数量。
输入
唯一的行包含一个非空的大写英文字母字符串,其长度最大为3×105。每个字母代表一个具有相应颜色的球。
输出
输出选择颜色和新球位置以消除所有球的方式数量。

【样例1】
BBWWBB
【样例2】
BWWB
【样例3】
BBWBB
【样例4】
OOOWWW
【样例5】
WWWOOOOOOWWW

样例输出 Copy

【样例1】
3
【样例2】
0
【样例3】
0
【样例4】
0
【样例5】
7


问题解释:就是要加入一个字母使得全部字母消失(消失就是,如果那个相同字母部分变得更长
并且其长度至少变为3,则该部分的所有球都将被消除。
例如BBWWBB加入一个W使的W增多并且W个数多余3,消去W,变成BBBB,B变多,且多于3个

思路就是:
把相同的合并变成BWB判断是不是回文串(关于中间的那个对称),并且对称的两个相等
且对称的两个相加大于三。注意偶数个不行
#include<bits/stdc++.h>
using namespace std;
struct node{
    char type;
    int num;
    node()
    {
        num=0;
    }   
}st[300010];
int main()
{
    string str;
    cin>>str;
    int s=1;
    st[1].type=str[0];
    st[1].num=1;
    for(int i = 1;i < str.size();i++)
    {
        if(str[i]==st[s].type) st[s].num++;
        else {
            st[++s].type = str[i];
            st[s].num = 1;
        }
    }
    /*for(int i=1;i<=s;i++)
    {
        cout<<st[i].type<<"   "<<st[i].num<<endl;
    }*/
    if(s%2==0){
        puts("0");
    }
    else{
        for(int l=1,r=s;l<r;l++,r--)
        {
            if(st[l].type!=st[r].type)
            {
                cout<<0<<endl;
                return 0;
            }
            else if(st[l].num+st[r].num<3)
            {
                cout<<0<<endl;
                return 0;
            }
        }
        if(st[s/2+1].num<2)
        {
            cout<<0<<endl;
            return 0;
        }
        else{
            cout<<st[s/2+1].num+1<<endl;
        }
    }
    return 0; 
}
 
原文地址:https://www.cnblogs.com/lipu123/p/13768204.html