hihoCoder #1039 : 字符消除
2016-03-12 15:13
302 查看
题目链接:
hihoCoder #1039 : 字符消除
单点时限:1000ms
内存限制:256MB
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行每行一个由’A”B”C’组成的字符串s,长度不超过100。
提示
第一组数据:在”ABCBCCCAA”的第2个字符后插入’C’得到”ABCCBCCCAA”,消除后得到”A”,总共消除9个字符(包括插入的’C’)。
第二组数据:”AAA”插入’A’得到”AAAA”,消除后得到”“,总共消除4个字符。
第三组数据:无论是插入字符后得到”AABC”,”ABBC”还是”ABCC”都最多消除2个字符。
样例输入
样例输出
hihoCoder #1039 : 字符消除
1039 : 字符消除
时间限制:1000ms单点时限:1000ms
内存限制:256MB
描述
小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
模拟,还挺锻炼思维的,字符串处理,没用库函数,(其实是我还不会用- -!)
/************************************************************************* > File Name: 1039_字符消除.cpp > Author: dulun > Mail: dulun@xiyoulinux.org > Created Time: 2016年03月12日 星期六 13时37分06秒 ************************************************************************/ #include<iostream> #include<stdio.h> #include<cstring> #include<string.h> #include<cstdlib> #include<algorithm> #define LL long long using namespace std; const int N = 50086; int xiaochu(char * s) { int n = 0; char t[109]; for(int i = 0; i <= strlen(s); i++) t[i] = s[i]; int flag = 1; while(1) { if(flag == 0) break; flag = 0; int i, j; for(i = 0; i < strlen(t); i++) { if(t[i] == t[i+1]) { flag = 1; for(j = i+2; j < strlen(t); j++) { if(t[j] != t[i]) break; } n+= j-i; int m = i; for(int k = j; k < strlen(t); k++, m++) { t[m] = t[k]; } t[m] = 0; i--;//防止遗漏 } } } // printf("xiaochu: %s : %d n=%d\n", t, (int)strlen(t), n); return n; } void add(char * t, char * s, int p, char l) { int i; for(i = 0; i < p ;i++) t[i] = s[i]; t[p] = l; for(i = p+1; i <= strlen(s); i++) t[i] = s[i-1]; t[i] = 0; } int main() { int n; cin>>n; for(int i = 0; i < n; i++) { char s[109]; cin>>s; int ans = xiaochu(s); for(int j = 0; j < strlen(s)+1; j++)//+1可以放在最末尾 { char t[109]; add(t, s, j, 'A'); ans = max(xiaochu(t), ans); add(t, s, j, 'B'); ans = max(xiaochu(t), ans); add(t, s, j, 'C'); ans = max(xiaochu(t), ans); } printf("%d\n", ans); } return 0; }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- BAT批处理中的字符串处理详解(字符串截取)
- Lua函数与字符串处理简明总结
- Transformation 能将 Windows XP/Server 2003 操作系统,完美地模拟成 Windows Vista 的软件
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 用javascript和css模拟select的脚本
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法