Time Limit: 1 Sec  Memory Limit: 128 MB

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
 
题解:刚开始看成了将字符串分段,对每种字符进行计数,后来仔细一看,重复的字符计数,不重复的原样输出,在头尾加上‘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[];
memset(a,,sizeof a);
Node tmp;
while(cin>>a)
{
queue<Node>q;
while(!q.empty())q.pop();
tmp.cnt=,tmp.str.clear();
tmp.str.push_back(a[]);
for(int i=,len=strlen(a); i<len; i++)
{
if(tmp.str.size()==)
{
if(*(--tmp.str.end())==a[i])
{
tmp.cnt++;
if(i==len-)q.push(tmp);
}
else
{
if(tmp.cnt==)
{
tmp.str.push_back(a[i]);
tmp.cnt++;
}
else
{
q.push(tmp);
tmp.cnt=;
tmp.str.clear();
tmp.str.push_back(a[i]);
}
if(i==len-)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=;
tmp.str.clear();
tmp.str.push_back(a[i]);
if(i==len-)q.push(tmp);
}
else
{
tmp.str.push_back(a[i]),tmp.cnt++;
if(i==len-)q.push(tmp);
}
}
}
while(!q.empty())
{
tmp=q.front();
q.pop();
if(tmp.str.size()==&&tmp.cnt!=)printf("%d%c",tmp.cnt,tmp.str[]);
else
{
cout<<"";
string::iterator it=tmp.str.begin();
for(;it!=tmp.str.end();it++)
{
if(*it=='')cout<<"";
else cout<<*it;
}
cout<<"";
}
}
printf("\n");
}
return ;
}

ZUFE 1035 字符宽度编码(字符串)的更多相关文章

  1. day4-基础 字符串操作,文件操作,字符转编码

    1.字符串用法 name = 'daniel' print(name.capitalize()) #首字母大写 >>>daniel print(name.count('a')) #统 ...

  2. php将长字符串拆分为指定最大宽度的字符串数组

    /** * 将字符串拆分为指定最大宽度的字符串数组.单字节字符宽度为1,多字节字符通常宽度为2 * @param string $msg 要拆分的字符串 * @param int $width 结果数 ...

  3. Base-64 字符数组或字符串的长度无效等问题解决方案

    项目特殊需要,调用ActiveX三维控件进行控件某一特殊部位的截图操作,这个截图保存由ActiveX控件控制保存到本地是没问题的,现在需要将这个截图上传到服务器,多人共享,就牵扯到需要读取本地文件…… ...

  4. WEB开发中的字符集和编码

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  5. 中文字符串转换为十六进制Unicode编码字符串

    package my.unicode; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Uni ...

  6. SQL Server获取下一个编码字符串的实现方案分割和进位

        我在前一种解决方案SQL Server获取下一个编码字符实现和后一种解决方案SQL Server获取下一个编码字符实现继续重构与增强两篇博文中均提供了一种解决编码的方案,考虑良久对比以上两种方 ...

  7. C#和VC++字符集和编码

    C# char 关键字用于声明 .NET framework 使用 Unicode 字符表示 System.Char 结构的实例. Char 对象的值是 16 位数字 (序号值.)将字符表示为 UTF ...

  8. 有关UNICODE、ANSI字符集和相关字符串操作

    Q UNICODE字符串如何显示 A 如果程序定义了_UNICODE宏直接用 WCHAR *str=L"unicodestring"; TextOut(0,0,str); 否则就需 ...

  9. 2017计算机学科夏令营上机考试-B编码字符串

    B:编码字符串 总时间限制:  1000ms 内存限制:  65536kB 描述 在数据压缩中,一个常用的方法是行程长度编码压缩.对于一个待压缩的字符串,我们可以依次记录每个字符及重复的次数.例如,待 ...

随机推荐

  1. zabbix 安装配置以及漏洞检测脚本

    最近zabbix爆出sql注入漏洞.之前一直没装过.就想着来安装一次.我在centos配置玩玩,记录一下:1.安装LAMP yum -y install httpd  mysql  mysql-ser ...

  2. sublime 2中Package control安装和使用

    安装: 安装时,如果想查看安装进度,可打开console(View->Show Console) 安装Package control有两中方法: 方法1:通过代码安装 import urllib ...

  3. CUDA开发时用到的各种Linux命令

    cat 读取文件中的全部内容. 例:cat cuda_add.cu

  4. iBeacon在iPhone锁屏下有几率扫描不到蓝牙设备以及折中解决方案

    前言: 这个问题的确困扰了很久,查了国内外各种论坛.社区,都没找到一个有效的解决办法. 所幸后来用一种折中的办法解决了,但也不是从技术根本上解决的,所以有解决的兄弟还望指导下. 正文如下: 一.需求描 ...

  5. Java的URL来下载网页源码

    import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; impor ...

  6. Python数据预处理—归一化,标准化,正则化

    关于数据预处理的几个概念 归一化 (Normalization): 属性缩放到一个指定的最大和最小值(通常是1-0)之间,这可以通过preprocessing.MinMaxScaler类实现. 常用的 ...

  7. extjs 6.2 helloworld

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. ECOS-Mongodb安装

    安装Mongodb服务 安装Mongodb服务 author :James,jimingsong@vip.qq.com since :2015-03-03 下载Mongodb安装包(64位哦) 安装M ...

  9. 最受欢迎的iOS第三方SDK

    http://www.raywenderlich.com/forums/viewtopic.php?t=4496

  10. 101个Linq的例子

    Where - Simple 1 筛选出数值中大于5的元素 public void Linq1() { int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 } ...