题意:给了一个长度为9的字符串,g、a、o三个字符分别有三个,问你能消除连续三个相同字符的次数有多少。
思路:容易知道答案就是[1,3]之间的值。
①、3的情况就是,有两种字符都是3个挨着的,比如gggaaaooo,goooaaagg,goooggaaa这样
先把那两个三个连续的消掉,第三种字符也可以三个一起消除。
还有gooaaaogg 这种,即231,中间是一种字符连续的三个,消除后,左边的1和右边的2是同一种类型也能消除。同理132也可以消除,如goaaaoogg。
②、2的情况不好判断,那么我们去判断1的情况,很明显要三个都消掉,我们只需要对于每种字符,看最左边和最右边的两个字符,他们中间是不是夹着其他两种字符,如果为了那这种字符消掉三个,那么一定要把中间消掉,这样把剩下两种消除了,最多只有1了。
比如gaoogaoga,第一个g和最后一个g之间包含了a和o,第一个a和最后一个a之间包含了g和o,第一个o和最后一个o之间包含了a和g,所以这样只有1次
前两种情况都不满足的话,那么就是两次了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
const ll mod=1e9+7;
struct node{
int x;char c;
}z[15];
string a;
bool check(char x,char y,char z){
for(int i=0;i<9;i++){
for(int j=8;j>=0;j--){
if(a[i]==x && a[j]==x){
int cnt1=0,cnt2=0;for(int k=i+1;k<j;k++){
cnt1 |= a[k]==y;cnt2 |= a[k]==z;}return (cnt1&&cnt2);}}}
}
int main(){
int T;while(cin>>T){
while(T--){
cin>>a;int num=0;int CNT=0;int now=1;char q=a[0];for(int i=1;i<9;i++){
if(a[i]==q) {
++now;}else{
z[++num]={
now,q};CNT+= now==3;now=1;q=a[i];}}CNT+= now==3;z[++num]={
now,q};int F=0;for(int i=2;i<num;i++){
if(z[i-1].x==1&&z[i+1].x==2 && z[i].x==3 && z[i-1].c==z[i+1].c || z[i-1].x==2&&z[i+1].x==1 && z[i].x==3 && z[i-1].c==z[i+1].c)F=1;}if(F || CNT>=2) puts("3");else if(check('g','a','o') && check('a','g','o') && check('o','a','g')) puts("1");else puts("2");}}return 0;
}