hihocoder 1039 字符串处理

小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:

1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。

2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"

游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符(‘A‘,‘B‘或者‘C‘),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。

请帮助小Hi计算要如何插入字符,才能获得最高得分。

输入

输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。

之后T行每行一个由‘A‘‘B‘‘C‘组成的字符串s,长度不超过100。

输出

对于每一行输入的字符串,输出小Hi最高能得到的分数。

提示

第一组数据:在"ABCBCCCAA"的第2个字符后插入‘C‘得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的‘C‘)。

第二组数据:"AAA"插入‘A‘得到"AAAA",消除后得到"",总共消除4个字符。

第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。

样例输入
3
ABCBCCCAA
AAA
ABC
样例输出
9
4
2

//
//  main.cpp
//  hiho1039
//
//  Created by Fangpin on 15/3/20.
//  Copyright (c) 2015年 FangPin. All rights reserved.
//

#include <iostream>
#include <string>
using namespace std;
string key[]={"A","B","C"};

int main(int argc, const char * argv[]) {
    // insert code here...
    int t;
    cin>>t;
    string s,ss;
    while(t--){
        cin>>ss;
        ss="*"+ss+"#";
        int ans;
        int len=ss.size();
        ans=len;
        int minn=ans+8;
        s.clear();
        for(int i=0;i<len-1;++i){
            for(int j=0;j<3;++j){
                s.clear();
                for(int k=0;k<=i;++k)
                    s+=ss[k];
                s+=key[j];
                for(int k=i+1;k<len;++k)
                    s+=ss[k];
                bool flag=true;
                while(flag){
                    flag=false;
                    int len=s.size();
                    for(int i=0;i<len;++i){
                        int j=0;
                        while(i+j<len && s[i+j]==s[i]) ++j;
                        if(j>1){
                            s.erase(i,j);
                            flag=true;
                            len-=j;
                            --i;
                        }
                    }
                }
                if(minn>s.length())
                    minn=s.length();
            }
        }
        cout<<ans-minn+1<<endl;
    }
    return 0;
}

时间: 2024-08-03 12:52:35

hihocoder 1039 字符串处理的相关文章

【hihocoder 1039 字符串消除】模拟

题目链接:http://hihocoder.com/problemset/problem/1039 题意:给定一个只由{A, B, C}组成的字符串s,长度为n, 故包含n+1个空隙:现要求在某个空隙插入一个来自{A, B, C}的字符,然后按照以下“消除规则”对插入后的字符串进行消除操作,问最多能消掉几个字符(包含插入的一个). 消除规则: 1. 自左至右扫描当前字符串,若字符v从某个位置开始连续出现了2次及以上,则此区间内的v全部消除: 2. 重复步骤1直至不再有可消除的字符. 思路:模拟,

hihoCoder 1039:字符消除(字符串处理)

#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和

hihoCoder 1039字符消除 (字符串处理)

http://hihocoder.com/problemset/problem/1039 因为字符串只由3种字母组成,并且插入的字符也只能是这三种字符的其中一个,那么可以考虑枚举这三个字符其中一个字符到字符串中任意一个位置.如果可以消除则不断消除,最后更新求得一个最大值. 首先介绍这个函数  substr    substr(start,length);  返回一个从指定位置开始,并具有指定长度的字符串. start 必选.所需子字符串的起始位置,字符串的第一个字符的索引为0. length可选

hihocoder #1039 : 字符消除 ( 字符串处理类 ) 好久之前做的题目,具体的算法代码中阅读吧

#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和

hihocoder 1039 解题报告(python)

1039_字符消除 题目链接: http://hihocoder.com/problemset/problem/1039 很久没刷题了赶紧刷点水题以免各种面试被bs 题目大意: 中文题目直接看题就懂 思路: 一时间也没有什么很好的感觉速度很快的思路,只好老老实实按照题目意思一步步的进行,还好能够AC.首先要考虑插入一个字母,位置可以是字符串中的任意一个位置,我也没多想这里直接用字符串拼接来完成.对于消除操作,写了一个函数来做这件事情,要消除所有连续出现的相同字母,直接用re的替换函数来实现,直到

hihocoder 1039

http://hihocoder.com/problemset/problem/1039 string (1) string& insert (size_t pos, const string& str); substring (2) string& insert (size_t pos, const string& str, size_t subpos, size_t sublen); c-string (3) string& insert (size_t pos

hihoCoder - 1039 - 字符消除 (模拟题~)

#1039 : 字符消除 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串.例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和

hihoCoder 1039 字符消除

题目来源:字符消除 解题思路: 1.在给定字符串中的任意位置插入'A'.'B'.'C'中的任意一个字符,然后计算插入后的字符经过消除后最短的字符串长度: 2.在计算字符消除后最短长度时,智能一遍一遍的计算,个人没有想出什么更好地方法 3.记录每次插入一个字符后经过第2步计算后最短的字符串长度min,最后原字符串的长度-min+1. 具体算法(java版,可以直接AC) 1 import java.util.Scanner; 2 3 public class Main { 4 5 public s

HDU 1039(字符串判断 **)

题意是检查一个字符串是否满足三个条件: 一.至少有一个元音字母.二.不能出现三个连续的元音或三个连续的辅音.三.除了 ee 和 oo 外不能出现两个连续相同字母. 若三个条件都能满足,该字符串满足条件,有一个条件不满足则该字符串不满足条件. 但是这道题的数据......一定有元音字母,长度一定不少于 3.省去很多麻烦...... 代码如下: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int len;