1.问题描述
Time Limit:1000ms
-
3 ABCBCCCAA AAA ABC
Sample Output
-
9 4 2
Description
小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计算要如何插入字符,才能获得最高得分。
Input
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。
Output
对于每一行输入的字符串,输出小Hi最高能得到的分数。
Hint
第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。
第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。
第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。
Sample Input
2.思路分析
3.代码
#include <iostream>
#include <string>
#include <vector>
using namespace std;
typedef unsigned int size_t;
bool panduan(string &str)
{
size_t len=str.size();
bool flag=1;
for(size_t i=0;i<len-1;i++)
{
size_t j=i+1;
if(str[i]==str[i+1])
flag=0;
}
return flag;
}
string eliminate(string &str)
{
string newstr("");
size_t len=str.size();
//char pre=NULL;
for(size_t i=0;i<len-1;)
{
size_t j=i+1;
if(str[i]!=str[j])
{
newstr+=str[i];
i++;
}
else
{
while(str[i]==str[j])
{
++j;
}
i=j;
if(j==len-1)
newstr+=str[j];
}
if(i==len-2)
{
if(str[i]==str[i+1])
break;
else
newstr+=str[i];
newstr+=str[i+1];
break;
}
}
str=newstr;
if(str=="")
return str;
if(!panduan(str))
{
return eliminate(str);
}
else
return str;
}
vector<int> maxscore(vector<vector<int>> vec)
{
int max=0,tmp,flagi=0,flagj=0;
size_t len_out=vec.size();
for(size_t i=0;i<len_out;i++ )
{
size_t len_in=vec[i].size();
for(size_t j=0;j<len_in;j++)
{
tmp=vec[i][j];
if(tmp>max)
{
max=tmp;//flagi=i;flagj=j;记录插入字母和位置
}
}
}
vector<int> arr;
arr.push_back(max);//arr.push_back(flagi);arr.push_back(flagj);这里用向量正是为了一起返回记录的内容
return arr;
}
int main()
{
vector<string> str;
int T;
cin>>T;
for(int i=0;i<T;i++)
{
string s;
cin>>s;
str.push_back(s);
}
string abc="ABC";
for(int i=0;i<T;i++)
{
int size=str[i].size();
vector<vector<int>> rvec;
for(int j=0;j<3;j++)
{
vector<int> score;
for(int ins=0;ins<=size;ins++)
{
string tmp=str[i];
int len1,len2;
string tmp1=tmp.insert(ins,1,abc[j]);
len1=tmp1.size();
string tmp2=eliminate(tmp1);
len2=tmp2.size();
score.push_back(len1-len2);
}
rvec.push_back(score);
}
vector<int> result=maxscore(rvec);
for(vector<int>::iterator m=result.begin();m!=result.end();m++)
{
cout<<*m<<" ";
}
cout<<endl;
}
return 0;
}