ZUFE 1035 字符宽度编码

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 117  Solved: 16
[Submit][Status][Web Board]

Description

你的任务是编写一个程序实现简单的字符宽度编码方法。规则如下:
将任何2~9个相同字符的序列编码成2个字符:第1个字符是序列的长度,用数字字符2~9表示,第2个字符为这一串相同字符序列中的字符。超过9个相同字符
构成的序列编码方法是先编码前面9个字符,然后再编码剩余的字符。
将任何不包括连续相同字符的序列编码成:先是字符“1”,然后是字符序列本身,最后还是字符“1”。如果字符“1”是序列中的字符,则对每个“1”
用两个字符“1”替换。
例如,字符串“12142”,编码后为“111211421”。这是因为这个字符串没有连续相同的字符,则编码后前后都是字符1,中间是字符串本身,而字符串本身又
包含了两个“1”对每个“1”,用两个“1”替换。

Input

输入文件包含若干行,每行的字符都是大小写字母字符、数字字符或标点符号,没有其他字符。

Output

对输入文件中每行进行字符宽度编码,并输出。

Sample Input

AAAAAABCCCC

Sample Output

6A1B14C

地址:(需要VPN)http://172.21.2.10/JudgeOnline/problem.php?id=1035

题解:刚开始看成了将字符串分段,对每种字符进行计数,后来仔细一看,重复的字符计数,不重复的原样输出,在头尾加上‘1’,并且,如果其中有‘1’,那么输出两个‘1’。所以思路是使用结构体保存字符计数(并不是用来计数的,而是输出的时候用来判断要不要头尾加上‘1’)和字符串,这里字符串用string保存,感觉比较方便。还有就是这题细节部分,样例中“BCC”部分,读取到第二个’C‘的时候,要把“BC”中的’C‘删除并将’B‘压入队列,然后清空string,将’C‘放入string,同时计数要变成2。最后还要考虑读取到字符最后一位的情况,四种情况都要加上读取到最后一位入队列的代码。

#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
//#define LOCAL
struct Node
{
    int cnt;
    string str;
};
int main()
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
#endif // LOCAL
    //Start
    char a[1200];
    memset(a,0,sizeof a);
    Node tmp;
    while(cin>>a)
    {
        queue<Node>q;
        while(!q.empty())q.pop();
        tmp.cnt=1,tmp.str.clear();
        tmp.str.push_back(a[0]);
        for(int i=1,len=strlen(a); i<len; i++)
        {
            if(tmp.str.size()==1)
            {
                if(*(--tmp.str.end())==a[i])
                {
                    tmp.cnt++;
                    if(i==len-1)q.push(tmp);
                }
                else
                {
                    if(tmp.cnt==1)
                    {
                        tmp.str.push_back(a[i]);
                        tmp.cnt++;
                    }
                    else
                    {
                        q.push(tmp);
                        tmp.cnt=1;
                        tmp.str.clear();
                        tmp.str.push_back(a[i]);
                    }
                    if(i==len-1)q.push(tmp);
                }
            }
            else
            {
                if(*(--tmp.str.end())==a[i])
                {
                    tmp.str.erase(--tmp.str.end()),tmp.cnt--;
                    //tmp.str.push_back(‘1‘);
                    q.push(tmp);
                    tmp.cnt=2;
                    tmp.str.clear();
                    tmp.str.push_back(a[i]);
                    if(i==len-1)q.push(tmp);
                }
                else
                {
                    tmp.str.push_back(a[i]),tmp.cnt++;
                    if(i==len-1)q.push(tmp);
                }
            }
        }
        while(!q.empty())
        {
            tmp=q.front();
            q.pop();
            if(tmp.str.size()==1&&tmp.cnt!=1)printf("%d%c",tmp.cnt,tmp.str[0]);
            else
            {
                cout<<"1";
                string::iterator it=tmp.str.begin();
                for(;it!=tmp.str.end();it++)
                {
                    if(*it==‘1‘)cout<<"11";
                    else cout<<*it;
                }
                cout<<"1";
            }
        }
        printf("\n");
    }
    return 0;
}
时间: 2024-10-13 10:46:46

ZUFE 1035 字符宽度编码的相关文章

字符的编码方式

1. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串.每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出 256种状态,这被称为一个字节(byte).也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111. 上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定.这被称为ASCII码,一直沿用至今. ASCII码一共规定了128个字符的

[转]各种字符集和编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了,在网上搜了搜,在书上翻了翻,总结一下吧.首先按照字符编码的历程来看: 1.  ASCII 我们需要了解的最早编码是ASCII码.它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来.如果你技艺高超,可以将该位用

使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码

摘要: URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换.在本文中,我们以使用URLDecoder解决GET请求中文乱码问题为场景说明 URLDecoder/URLEncoder 的用法,并给出了 application/x-www-form-urlencoded MIME 字符串的编码规则. 一. URLDecoder/URLEncoder 使用场景概述 URLDecode

WEB开发中的字符集和编码

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

你不知道的 字符集和编码(编码字符集与字符集编码)

我的上篇文章,有朋友提出字符集和编码的区别,我在此立文和大家讨论下 常说的字符集和编码区别,其实就是编码字符集和字符集编码的区别,其实,单单如果只是说字符集,没有任何编码的概念的话,那么字符集其实仅仅是一个简单的字符的集合,或者说是一个抽象的字符的集合,包括文字,符号等等,不参与任何存储形式,只是存在这么各种各样标准的字符的集合 如果仅仅是抽象的字符集,我们是无需拿出讨论的,因为没有任何异议,通俗易懂,而常说的字符集指的编码字符集,比如常见的 unicode.ascii.gb2312.gbk等,

字符的编码与解码

在浏览网页,编写程序时,偶尔会碰到一些乱码问题.例如在打开一个网页时,没有一个正常字符可辨识的,全是一些奇怪的符号,方块.问号等等.通过浏览器的tools->encoding选择UTF-8或者GBK,显示就正常了.为什么会乱码,UTF-8和GBK又是什么东西呢? 汉子,字母等字符,我们可以识别,并理解它们的表达信息.但计算机不能直接识别这些字符,它只能理解二进制信息.为了让计算机能够处理,表示字符,我们需要将字符转换成二进制表达,交给计算机处理.再将计算机处理输出的二进制信息转换成字符.所以这里

各种字符集和编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这 个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了,在网上搜了搜,在书上翻了翻,总结一下吧.首先按照字符编码的历程来看: 1.  ASCII 我们需要了解的最早编码是ASCII码.它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有 可能的ASCII字符,而且有整整一位空余下来.如果你技艺高超,可以将该

字符 字节 编码

转载:http://www.regexlab.com/zh/encoding.htm 级别:中级 摘要:本文介绍了字符与编码的发展过程,相关概念的正确理解.举例说明了一些实际应用中,编码的实现方法.然后,本文讲述了通常对字符与编码的几种误解,由于这些误解而导致乱码产生的原因,以及消除乱码的办法.本文的内容涵盖了“中文问题”,“乱码问题”. 掌握编码问题的关键是正确地理解相关概念,编码所涉及的技术其实是很简单的.因此,阅读本文时需要慢读多想,多思考. 引言 “字符与编码”是一个被经常讨论的话题.即

Python 之 字符转编码操作

字符转编码操作 # -*- coding:utf-8 -*- import sys print(sys.getdefaultencoding()) s = "你好" python2写法,将s转换成"gbk" s_to_gbk = s.decode("utf-8").encode("gbk") #1.在Python2下,所有字符编码为"ascii"#2.当文件头声明定义为:utf-8#3.将s转换gbk,首先