微软2014编程之美初赛第二场——题目2 : 字符串压缩

【来源】

题目2 : 字符串压缩

【分析】

把游程编码恢复为原始字符串,然后得出每一行的字符串的内容,放在一个vector中。用map统计vector中每一行的反复的次数。

比較两个游程编码得到的map是否同样就可以。

该算法占用空间太多,小数据AC,大数据MLE了。

【代码】

#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <sstream>
using namespace std;

int main()
{
    int T;
    cin >> T;
    for (int c = 0; c < T; ++c){
        int L;
        cin >> L;
        string code1, code2;
        cin >> code1 >> code2;
        stringstream ss1;
        ss1 << code1 + "0A";
        stringstream ss2;
        ss2 << code2 + "0A";

        string raw1 = "";
        string raw2 = "";
        while(!ss1.eof()){
            int freq;
            ss1 >> freq;
            char c;
            ss1 >> c;
            if (freq == 0){
                break;
            }
            for (int j = 0; j < freq; ++j){
                raw1 += c;
            }
        }

        while (!ss2.eof()){
            int freq;
            ss2 >> freq;
            char c;
            ss2 >> c;
            if (freq == 0){
                break;
            }
            for (int j = 0; j < freq; ++j){
                raw2 += c;
            }
        }

        int lines = raw1.size()/L;
        vector<string> lines1, lines2;
        map<string, int> map1, map2;
        for (int i = 0; i < lines; ++i){
            string line = "";
            for (int j = 0; j < L; ++j){
                line += raw1[i+j*lines];
            }
            if (map1[line] == 0){
                map1[line] = 1;
            }
            else{
                ++map1[line];
            }
            lines1.push_back(line);
        }

        for (int i = 0; i < lines; ++i){
            string line = "";
            for (int j = 0; j < L; ++j){
                line += raw2[i + j*lines];
            }
            if (map2[line] == 0){
                map2[line] = 1;
            }
            else{
                ++map2[line];
            }
            lines2.push_back(line);
        }
        int ii;
        for (ii = 0; ii < lines; ++ii){
            if (map1[lines1[ii]] != map2[lines1[ii]]){

                break;
            }
        }
        int jj;
        for (jj = 0; jj < lines; ++jj){
            if (map1[lines2[jj]] != map2[lines2[jj]]){

                break;
            }
        }

        if ((ii == lines) && (jj == lines) && (raw1.size() == raw2.size())){
            cout << "Case " << c + 1 << ": Yes" << endl;
        }
        else{
            cout << "Case " << c + 1 << ": No" << endl;
        }
    }

    //system("pause");
    return 0;
}

【点评】

字符串处理题。当时想的算法太占用空间了,应该能够利用文本内容仅仅有a-z这26个字符来做文章,比方Hash什么的。

时间: 2024-10-11 04:32:07

微软2014编程之美初赛第二场——题目2 : 字符串压缩的相关文章

微软2014编程之美初赛第一场——题目2 : 树

[来源] 题目2 : 树 [分析] 依据输入情况建立起树的模型.树的表示是一个表明父亲节点的数组.核心算法有两个: 计算某一节点的深度.用循环实现,一直向上找父亲节点,直到找到根节点.计算循环的次数即为深度. 计算某一节点的全部子节点.用递归实现. 本题在实现上节点的命名从0至N-1,与题目描写叙述不同. [代码] #include <iostream> #include <vector> using namespace std; vector<int> childre

微软2014编程之美初赛第一场——题目3 : 活动中心

[来源] 题目3 : 活动中心 [分析] 本题採用的是三分法. 输入的一组点中找出左右边界.作为起始边界. while(右边界-左边界<精度){ 将左右边界构成的线段均匀分成3段,推断切割点的距离关系,抹去距离大的一段.更新左右边界. } 输出左(右)边界 [代码] #include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std;

编程之美初赛第二场 集合

题目3 : 集合 时间限制:12000ms 单点时限:6000ms 内存限制:256MB 描述 统计满足下列条件的集合对(A, B)的数量: A,B都是{1, 2, -, N}的子集: A,B没有公共的元素: f(A)<= f(B).f(S)定义为S中所有元素的按位异或和.例如, f({}) = 0, f({1, 3}) = 2. 因为答案可能很大,你只需要求出它除以M的余数. 输入 第一行一个整数T (1 ≤ T ≤ 10),表示数据组数. 接下来是T组输入数据,测试数据之间没有空行. 每组数

2015编程之美初赛第二场扑克牌

一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个整数N,表示给定的牌的张数,接下来N个由空格分隔的字符串,每个字符串长度为2,表示一张牌.每组数

编程之美初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 一副不含王的扑克牌由52张牌组成,由红桃.黑桃.梅花.方块4组牌组成,每组13张不同的面值.现在给定52张牌中的若干张,请计算将它们排成一列,相邻的牌面值不同的方案数. 牌的表示方法为XY,其中X为面值,为2.3.4.5.6.7.8.9.T.J.Q.K.A中的一个.Y为花色,为S.H.D.C中的一个.如2S.2H.TD等. 输入 第一行为一个整数T,为数据组数. 之后每组数据占一行.这一行首先包含一个

2014百度之星初赛(第二场)——Best Financing

2014百度之星初赛(第二场)--Best Financing Problem Description 小A想通过合理投资银行理财产品达到收益最大化.已知小A在未来一段时间中的收入情况,描述为两个长度为n的整数数组dates和earnings,表示在第dates[i]天小A收入earnings[i]元(0<=i<n).银行推出的理财产品均为周期和收益确定的,可描述为长度为m的三个整数数组start.finish和interest_rates, 若购买理财产品i(0<=i<m),需要

2014百度之星初赛(第二场)——JZP Set

2014百度之星初赛(第二场)--JZP Set Problem Description 一个{1, ..., n}的子集S被称为JZP集,当且仅当对于任意S中的两个数x,y,若(x+y)/2为整数,那么(x+y)/2也属于S. 例如,n=3,S={1,3}不是JZP集,因为(1+3)/2=2不属于S.但是{1,2,3}的其他子集都属于S,所以n=3时有7个JZP集 给定n,求JZP集的个数. Input 第一行为T,表示输入数据组数. 每组数据包含一行整数n. 限制条件 1<=T<=10^5

2014百度之星初赛(第二场)——Chess

2014百度之星初赛(第二场)--Chess Problem Description 小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2)

2014微软编程之美初赛第一场第三题 活动中心

活动中心 时间限制:12000ms 单点时限:6000ms 内存限制:256MB 描写叙述 A市是一个高度规划的城市,可是科技高端发达的地方,居民们也不能忘记运动和锻炼,因此城市规划局在设计A市的时候也要考虑为居民们建造一个活动中心,方便居住在A市的居民们能随时开展运动,锻炼强健的身心. 城市规划局希望活动中心的位置满足下面条件: 1. 到全部居住地的总距离最小. 2. 为了方便活动中心的资源补给和其它器材的维护,活动中心必须建设在A市的主干道上. 为了简化问题.我们将A市摆在二维平面上,城市的