时间限制: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. 浅析"Sublabel-Accurate Relaxation of Nonconvex Energies" CVPR 2016 Best Paper Honorable Mention

    今天作了一个paper reading,感觉论文不错,马克一下~ CVPR 2016 Best Paper Honorable Mention "Sublabel-Accurate Rela ...

  2. The Zen Programmer

    专注 何为专注 关于 休息 怎么睡觉 心无杂念 我的体会 自我分析 初学者心态 无我 不要设置职业目标 敏事慎言 正念 做自己的老板 玩物养志 结语 最近在研读Christian Grobmeier ...

  3. android 网络连接 HttpGet HttpPost方法

    1.本文主要介绍利用HttpGet和HtppPost方法来获取网络json数据. 代码如下: public HttpData(String Url,HttpGetDataListener listen ...

  4. [Mysql]Innodb 独立表空间和共享表空间

    innodb有2中表空间方式: 共享表空间 和 独立表空间 查询数据的设置: show variables like '%per_table'; 默认是共享表空间,独立表空间在配置文件中添加 inno ...

  5. Tomcat内核之Tomcat的类加载器

    跟其他主流的Java Web服务器一样,Tomcat也拥有不同的自定义类加载器,达到对各种资源库的控制.一般来说,Java Web服务器需要解决以下四个问题: ①   同一个Web服务器里,各个Web ...

  6. 百度地图开发之POI数据检索

    前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 poi检索api的基本用法 百度地图的POI类中共有如下几个方法 PoiBoundSearchOption POI范围内检索 ...

  7. hbase操作(shell 命令,如建表,清空表,增删改查)以及 hbase表存储结构和原理

    两篇讲的不错文章 http://www.cnblogs.com/nexiyi/p/hbase_shell.html http://blog.csdn.net/u010967382/article/de ...

  8. linux2.6内核链表

    一.        链表数据结构简介      链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链 ...

  9. Ubuntu下安装GTK环境

    要生成C图形界面的程序,得安装GTK环境     安装GTK环境只要安装一个gnome-core-devel就可以了,里面集成了很多其他的包.除此之外还要转一些其他的  东西,如libglib2.0 ...

  10. 01_Weblogic课程之概念篇:代理服务器,web服务器,应用程序服务器,JNDI概念,JTA概念,Java消息服务,Java验证和授权(JAAS),Java管理扩展,Web客户机,客户机应用程序

     1 什么是服务器 Weblogic中服务器分为两种,一种是受管服务器,另外一种是管理服务器. Weblogic课程(Weblogic是Oracle公司的,最开始的是BEA公司的) 一 系统管理 ...