Best Compression Algorithms(网易游戏2015笔试题)
2015-09-15 23:57
429 查看
Question
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
易信是由网易和电信联合开发的一款即时通讯软件。除了语音聊天,免费电话等新功能以外,传统的文字信息聊天功能也得以保留,因此每天都有大量的文字信息需要在服务器中存储,中转。小Y是一名负责处理文字信息的易信工程师,每天他都要和字符串打交道。为了提高存储和传输效率,小Y在课余时间经常会去研究字符串的存储方法。通过内部使用的一种统一的加密算法,所有的文字信息首先都会被转化成只包含大写字母['A'...'Z']的字符串。为了压缩这个加密后的字符串,小Y最近想出了两个存储的规则:
(1)如果字符串中有连续相同的大写字母,它们可以选择用"字符+出现次数"的方式替代。如字符串'AABCCCCDD',可以用'A2BC4D2'表示,也可以用'A2BC2C2DD'表示。
(2)如果字符串中有连续出现的模式串(模式串长度大于1),它们可以选择用"(模式)+出现次数"的方式替代。如字符串'FABCABCABCE',可以用'F(ABC)3E'表示,也可以用'F(ABC)2ABCE'表示。
上述规则中的"连续"均指出现次数大于1,规则(2)中的括号后一定是一个大于1的数值,代表出现次数。
综合上述两个规则,字符串'AABAABFAABAABFG'可以用'((A2B)2F)2G'表示。小Y保证输出的压缩串符合上述的两个规则,以下类型的非法字符串不会出现:
'(A)5': 括号冗余
'A1A4': 数字1冗余
'A((AA))2': 括号冗余
(ABC)1: 括号和数字1冗余
对于给定的一个用上述规则压缩后的字符串,对应的原串是唯一的。小Y想知道这个字符串原来的长度是多少,以此计算压缩倍率。你能帮助他吗?
输入
第一行是整数T(T <= 100),表示下面有T组数据。之后T行,每行为一组数据,每组数据为一个字符串。每个字符串只会包含26个大写字母['A'...'Z'],数字['0'...'9']和左右括号['(', ')']。
保证输入数据一定合法,括号内的模式串长度一定大于1,表示出现次数的数字一定大于1,且字符串长度L <= 100。
输出
输出T行,每行对应一个数据的输出结果,表示字符串的实际长度。保证每个字符串展开后的长度不超过109。
样例输入
4 (AA)2A ((A2B)2)2G WANGYI A2BC4D2
样例输出
5 13 6 9
My Solution
#include <iostream> #include <vector> #include <string> using namespace std; /*得到数字,并让指针指向最后一个数*/ int getDig(const string& str, int& idx) { int dig = 0; for (; idx < str.size(); ++idx) { if (str[idx] >= '0' && str[idx] <= '9') //数字 { dig = dig * 10 + str[idx] - '0'; } else // 不是数字 { --idx; break; } } return dig; } int countLength(const string& str, int& idx) { int score = 0; int sSub = 0; for (; idx < str.size(); ++idx) { char c = str[idx]; if (c >= 'A' && c <= 'Z') //字符 { ++score; } else if (c == '(') { ++idx; sSub = countLength(str, idx); } else if (c == ')') { return score; } else // 数字 { if (str[idx - 1] == ')') //跟在模式串后面 { int dig = getDig(str, idx); score += dig * sSub; } else { int dig = getDig(str, idx); score += dig - 1; } } } return score; } int main() { /*读取字符串*/ int t; vector<string> lines; cin >> t; for (int i = 0; i < t; ++i) { string line; cin >> line; lines.push_back(line); } for (auto str : lines) { int start = 0; cout << countLength(str, start) << endl; } return 0; }
相关文章推荐
- POJ1389Area of Simple Polygons【离散化+线段树+扫描线】
- django获取url参数总结
- UVALive 5985 Robbing Gringotts(费用流 + 折半状压)
- mongo分片
- 网易2016两道题Assuming Digits && Best Compression Algorithms
- GOF23设计模式之 建造者模式
- OC分类(Category)的作用和注意事项
- mongo第一天(mongo初体验)
- 在Mac OSX下安装和使用GO语言
- django 1.8 官方文档翻译:2-1-1 模型语法
- django 1.8 官方文档翻译:5-1-4 内建的Widget
- django 1.8 官方文档翻译:5-1-2 表单API
- pgpgin|pgpgout|pswpin|pswpout意义与差异
- Go语言导出excel文件(.xlsx)
- 调用摄像头和相册,从相册中选择(含有google发布的图片压缩以及自己的图片截取)
- USACO Section 1.3 Greedy Algorithm
- django 1.8 官方文档翻译:6-5-1 Django中的测试
- Leetcode Algorithm No.260 Single Number III
- 2015年LOGO设计年度趋势报告
- Category分类用法