时间限制: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

代码:
#include "stdio.h"
#include <iostream>
#include <string>
#include <stack>
using namespace std;

int pow( int n)
{
    int result =1;
    if (n == 0)
    {
         return 1 ;
    }
    else {
         for ( int i = 0 ; i < n; ++i )
         {
            result *= 10 ;
         }
    }
    return result ;
}

int main() {
    int n;
    string str;
    cin >> n ;
    while (n--) {
        cin >> str;
        stack <char> stack1;
        stack <char> stack2;
         bool isleft = false;
         bool isbacket = false;
         int result = 0;

         for ( int i = 0 ; i < str.length (); ++ i)
         {
             if ( str[i ] == '(' )
             {
                isleft = true ;
                stack1 .push( str[i ]);
             }
             else if (str[i ]==')')
             {
                 int multi = 1;
                 int count = 0;
                 bool hasnum=false;
                 while ( stack1.size () > 0 && stack1.top ()!= '(' )
                 {
                     if ( stack1.top () >= '0' && stack1.top () <= '9' )
                     {
                        multi += ( stack1.top () - '0' ) * pow(count ) - 1;
                        count ++;
                        hasnum = true ;
                        stack1 .pop();
                     }
                     else if (stack1.top () >= 'A' && stack1.top () <= 'Z' )
                     {
                         if ( hasnum)
                         {
                            result += multi;
                            multi = 1 ;
                            count = 0 ;
                            hasnum = false ;
                         }
                         else {
                            result ++;
                         }
                        stack1 .pop();
                     }

                 }
                 if ( isbacket&& hasnum && stack1.top() == '(' )
                 {
                    result *= multi;
                    isbacket = false ;
                    hasnum = false ;
                 }
                stack1 .pop();
                 if ( stack1.empty ())
                 {
                    isleft = false ;
                 }
             }
             else {
                 int multi = 1;
                 int count = 0;
                 bool hasnum = false;
                 if ( isleft)
                 {
                     if ( str[i ] >= '0' && str[i ] <= '9' && str[i - 1 ] == ')')
                     {
                        isbacket = true ;
                     }
                    stack1 .push( str[i ]);
                 }
                 else if (str[i ]>= '0' && str[i ] <= '9')
                 {
                     if ( str[i -1] == ')'&& isbacket == false)
                     {
                        isbacket = true ;
                     }
                    stack2 .push( str[i ]);
                     if (( str[i +1]>= 'A' && str[i +1]<= 'Z')|| str [i+ 1] == '\0')
                     {
                         while (! stack2.empty ())
                         {
                            multi += ( stack2.top () - '0' )* pow( count) -1;
                            count ++;
                            stack2 .pop();
                         }

                     }
                     if ( isbacket)
                     {
                        result = multi* result;
                        isbacket = false ;
                     }
                     else {
                        result += multi;
                        hasnum = true ;
                     }
                 }
                 else if (str[i ] >= 'A' && str[i ] <= 'Z' )
                 {
                    isbacket = false ;
                    result ++;
                 }
                 if ( hasnum)
                 {
                    result --;
                 }
             }
         }
        cout << result << endl;
    }
}

【面试笔试算法】Program 4 : Best Compression Algorithms(网易游戏笔试题)的更多相关文章

  1. 【面试笔试算法】Program 5 : 推箱子 (网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 推箱子是一款经典游戏.如图所示,灰色格子代表不能通过区域,蓝色方格是箱子,黑色圆形代表玩家,含有圆点的格子代表目标点. 规 ...

  2. 【面试笔试算法】Program 3 : Complicated Expression(网易游戏笔试题)

    时间限制:50000ms 单点时限:5000ms 内存限制:256MB 描述 在lisp语言中,表达式都用前缀法表示,例如,1 + 2 在lisp中使用(+ 1 2)来表示,其中,表达式的括号是必需的 ...

  3. 【面试笔试算法】Program 2:Amusing Digits(网易游戏笔试题)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 网易成立于1997年6月,是中国领先的互联网技术公司.其相继推出了门户网站.在线游戏.电子邮箱.在线教育.电子商务等多种服 ...

  4. 【面试笔试算法】Program 6: 字符消除(hiho题库)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在玩一个字符消除游戏.给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的: 1) ...

  5. 【面试笔试算法】Problem 9: 腾讯2016年研发实习笔试题:最长回文子串

    (一)题目 问题:求给定字符串s的回文(palindrome)子串中,长度最大的回文子串的长度. 回文(palindrome)是指从左往右读和从右往左读字符串,看到的字符串都是一样的.比如" ...

  6. 【面试笔试算法】牛客网一站通Offer编程题2016.4.19

    牛客网一站通offer (一)字符串变形 1. 题目: 对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形.首先这个字符串中包含着一些空格,就像"Hello Wor ...

  7. 【面试笔试算法】Problem 8: 然而沼跃鱼早就看穿了一切(hiho题库)

    时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 fjxmlhx每天都在被沼跃鱼刷屏,因此他急切的找到了你希望你写一个程序屏蔽所有句子中的沼跃鱼("marshtom ...

  8. 【面试笔试算法】Problem 7: 补提交卡(hiho题库)

    时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho给自己定了一个宏伟的目标:连续100天每天坚持在hihoCoder上提交一个程序.100天过去了,小Ho查看自己的提交 ...

  9. 【面试笔试算法】Problem 1 : DP滑雪问题--网易互联网算法实习生2017笔试题

    Description Michael喜欢滑雪百这并不奇怪,因为滑雪的确很刺激.可是 为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...

随机推荐

  1. iOS-改变UITextField的Placeholder颜色的三种方式

    转自:http://blog.csdn.net/mazy_ma/article/details/51775670 有时,UITextField自带的Placeholder的颜色太浅或者不满足需求,所以 ...

  2. GDAL库进度信息编写示例

    GDAL进度信息编写 GDAL库中的算法以及读写数据的时候一般都会提供两个与进度信息相关的参数,下面分别进行描述: GDALProgressFunc pfnProgress void * pProgr ...

  3. 网站开发进阶(四十四)input type="submit" 和"button"的区别

    网站开发进阶(四十四)input type="submit" 和"button"的区别   在一个页面上画一个按钮,有四种办法: 这就是一个按钮.如果你不写ja ...

  4. 详解EBS接口开发之采购订单导入

    采购订单常用标准表简介 1.1   常用标准表 如下表中列出了与采购订单导入相关的表和说明: 表名 说明 其他信息 po.po_headers_all 采购订单头 采购订单号,采购类型,供应商,地点, ...

  5. Android系统的安全设计与架构

    Android系统的安全设计与架构 一.安全策略 1.Android 的总体架构由5个主要层次上的组件构成,这5层是:Android应用层. Android框架层.Dalvik虚拟机层.用户空间原生代 ...

  6. Android开发基础规范(一)

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52602487 前言:Androi ...

  7. Linux--DNS服务器

     DNS是Internet上使用最普遍,也是最重要的服务之一,通过DNS我们才可以访 问丰富多彩的网络,而DNS服务器就是为了实现域名解析功能而搭建的. 域名系统采用层次结构,按地理区域或机构区域 ...

  8. FFmpeg源代码简单分析:avcodec_close()

    ===================================================== FFmpeg的库函数源代码分析文章列表: [架构图] FFmpeg源代码结构图 - 解码 F ...

  9. 高仿腾讯QQ即时通讯IM项目

    前言:其实这个项目早就开发完成了,在本人的github上,本来没打算写成博客的形式,因为一个项目要写出来要花很久,但是最近看到很多 人在我的github上download后随意发布到网上,本来上传到g ...

  10. iOS中 通知中心Text (实例)

    指定根视图 self.window.rootViewController = [RootViewController new]; 方法实现: #import "RootViewControl ...