ACM详解(7)——压缩与编码

北大ACM竞赛培训与杭电ACM题库实战资料整合 ACM国际大学生程序设计竞赛(ACM ICPC)是世界上最权威的计算机程序设计竞赛之一,自1970年起,吸引了全球顶尖高校和计算机精英的关注和参与。它不仅是学生展示编程实力的平台,也是技术交流和人才发掘的重要场所。竞赛要求参赛者在有限时间内解决复杂的算法问题,这不仅考验了个人的编程技巧,更重要的是考察团队合作和问题解决能力。ACM ICPC的核心在于算法与数据结构的深入理解及应用。参赛队伍通常由三人组成,他们需要合作完成一系列编码挑战。 阅读详情

     有些题目会给出一些简单的压缩方法或者编码方法,让你实现具体的算法。下面通过题目分析。

1、Parencodings
Description
Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways:
By an integer sequence P = p1 p2...pn where pi is the number of left parentheses before the ith right parenthesis in S (P-sequence).
By an integer sequence W = w1 w2...wn where for each right parenthesis, say a in S, we associate an integer which is the number of right parentheses counting from the matched left parenthesis of a up to a. (W-sequence).
 
Following is an example of the above encodings:
S                 (((()()())))
P-sequence          4 5 6666
W-sequence         1 1 1456
Write a program to convert P-sequence of a well-formed string to the W-sequence of the same string.
Input
The first line of the input contains a single integer t (1 <= t <= 10), the number of test cases, followed by the input data for each test case. The first line of each test case is an integer n (1 <= n <= 20), and the second line is the P-sequence of a well-formed string. It contains n positive integers, separated with blanks, representing the P-sequence.
Output
The output file consists of exactly t lines corresponding to test cases. For each test case, the output line should contain n integers describing the W-sequence of the string corresponding to its given P-sequence.
Sample Input
2
6
4 5 6 6 6 6
9
4 6 6 6 6 8 9 9 9
Sample Output
1 1 1 4 5 6
1 1 2 4 5 1 1 3 9
翻译: S = s1 s2...s2n 是结构正确的(有左括号和右括号组成,并且数量相等,并且对应关系正确)小括号序列,他可以使用两种方式编码:
正整数序列 P = p1 p2...pn , pi 表示第 i 个右括号之前的左括号的数量( P 序列);
正整数序列 W = w1 w2...wn , wi 表示第 i 个右括号对应的左括号的位置(从右向左数, 1,2,3 )( w 序列)。
题目要求根据 p 序列求出 w 序列。
解题思路:
对于 p 序列中的每个元素 pi :
循环判断之前的左括号,对于遇到的每个左括号:
判断是否已经与其他右括号配对,如果已经配对,继续向左判断;
如果没有,则记录它是第几个左括号。
以 4 5 6 6 6 6 为例分析,首先创建数组 a 表示左括号, 1 表示没有配对的左括号, 0 表示已经配对的左括号。初始情况 a 的值为 1 1 1 1 1 1
读取 p 序列中的信息
P1=4 从 a[3] 开始判断左括号, a[3]=1 ,所以与 a[3] 括号对应,所以 w1=1 , a 的值 1 1 1 0 1 1
P2=5 从 a[4] 开始判断左括号, a[4]=1 ,所以与 a[4] 括号对应,所以 w2=1 , a 的值 1 1 1 0 0 1
P3=6 从 a[5] 开始判断左括号, a[5]=1 ,所以与 a[5] 括号对应,所以 w3=1 , a 的值 1 1 1 0 0 0
P4=6 从 a[5] 开始判断左括号, a[5]=0 , a[4]=0,a[3]=0,a[2]=1, 所以与 a[2] 括号对应,所以 w4=4 , a 的值 1 1 0 0 0 0
同理得到 w5=5 w6=6
最后的 w 序列为: 111456
参考代码略。
2、Encoding
描述
Given a string containing only 'A' - 'Z', we could encode it using the following method:
1. Each sub-string containing k same characters should be encoded to "kX" where "X" is the only character in this sub-string.
2. If the length of the sub-string is 1, '1' should be ignored.
输入
The first line contains an integer N (1 <= N <= 100) which indicates the number of test cases. The next N lines contain N strings. Each string consists of only 'A' - 'Z' and the length is less than 10000.
输出
For each test case, output the encoded string in a line
样例输入
2
ABC
ABBCCC
样例输出
ABC
A2B3C
翻译:把字符串中出现的连续相同的多个字符使用该字符以及出现的次数表示,例如 ABBCCC 中的 BB 可以使用 2B 表示,可以使用 3C 表示。题目要求对给定的字符串编码。
解题思路:遍历字符串,取出每个字符与之前的字符进行比较,如果相等计数加 1 ,不相同,则从新计数。例如 ABBCCC ,可以处理如下。
先初始化, c 表示前一个字符, count 表示统计次数。 c=’0’,count=0 。
对于 A ,之前没有字符, count=1 , c=’A’;
对于 B ,之前的字符是 ’A’ ,输出 A , count=1 , c=’A’ ;
对于 B ,之前的字符是 ’B’ , count=2 ;
对于 C ,之前的字符是 ’B’ ,输出 2B , count=1 , c=’C’;
对于 C ,之前的字符是 ’C’ , count=2;
对于 C ,之前的字符是 ’C’ , count=3;
最后输出 3C 。
输出的结果是 A2B3C
参考代码如下:
         /*
          * 字符串编码
          */
         public static void test5(String str){
                   int count=1;
                   char c=str.charAt(0);
                   for(int i=1;i<str.length();i++){
                            if(str.charAt(i)==c){
                                     count++;
                            }else{
                                     if(count!=1)
                                               System.out.print(count);
                                     System.out.print(c);
                                     count=1;
                                     c=str.charAt(i);
                            }
                   }
                   if(count!=1)
                            System.out.print(count);
                   System.out.print(c);
         }

 

ACM算法集合(涵盖各类算法题型+分析+源码) 1、适用于有意参加ACM编程竞赛、提升个人编程思想的人 2、本文件包含ACM的绝大多数算法题型+分析+源码,帮你快速掌握算法,题型范围广泛:数学问题、字符串处理、计算几何、数论、图论、排序/查找、数据结构。 3、题型全面,比如:大数阶乘、大数乘法运算、精度计算、进制转换、判断两线段是否相交、队列、树、图、快排等等.. 立即下载

相关推荐

ACM的codes编码器实现的 音频压缩

利用低级音频函数WaveX,如waveinopen等函数,实现的语音压缩。

VC调用ACM音频编程接口压缩Wave音频

 摘要: 本文介绍了在Microsoft Visual C++ 6.0下如何调用ACM(Audio Compression Manager,音频 压缩管理器)音频压缩编程接口对原始录入的Wave音频进行数据压缩。  关键字:ACM、CODECs、Wave音频、音频编码压缩  引言  音频和视频是多媒体应用程序向用户提供信息的主要方式,这些音频、视频数据一般都具有较高的采样率,经过压缩的原始数据

772

C语言ACM趣味和经典习题190例.zip

ACM新手必备的编程题,C语言经典算法和习题大全。囊括大部分的算法和习题,编程必备。每天一道必成高手。

VC下调用ACM音频编程接口压缩Wave音频

摘要:本文介绍了在Microsoft Visual C++ 6.0下如何调用ACM(Audio Compression Manager,音频 压缩治理器)音频压缩编程接口对原始录入的Wave音频进行数据压缩。    要害字:ACM、CODECs、Wave音频、音频编码压缩    引言      音频和视频是多媒体应用程序向用户提供信息的主要方式,这些音频、视频数据一般都具有

jasonfqw的专栏 770

Acm编程接口实现压缩

利用Windows的ACM(Audio Compression Manager)编程接口实现声音数据的压缩。

VC中调用ACM编程接口的音频压缩方法.zip

VC中调用ACM编程接口的音频压缩方法.zip

实现能效升级 | 基于ACM32 MCU的冰箱压缩机变频方案

它从吸气管吸入低温低压的制冷剂气体,通过电机运转带动活塞对其进行压缩后,向排气管排出高温高压的制冷剂气体,为整个制冷循环提供源动力。ACM32G103主频高,支持浮点运算和DSP,内置CORDIC,可以轻松实现上述的SVPWM产生器,Park/Clark变换,PI控制器,以及转子位置观测器。非线性模块的思路就是把估算的磁链的幅值与实际磁链幅值的差,作为估算的磁链分量的补偿项。• eFlash:320KB,加密存储,4KB I-Cache,4KB D-Cache,支持Flash加速0等待执行。

Qingniu01的博客 1930

SpringBoot实战——仿b站项目(一)

热部署就是当应用程序这种运行的时候升级冉家或者修改某一部分代码、配置文件时,无需手动启动应用,即可修改的部分生效工具 + IDEA配置。

weixin_52880572的博客 3456

ACM-ICPC真题讲解:“哈夫曼编码”

哈夫曼编码是一种非常实用的数据压缩技术,掌握它对于解决实际问题和参加编程竞赛都有很大的帮助。希望这篇博客能帮助大家更好地理解哈夫曼编码,并在ACM-ICPC等竞赛中取得好成绩。

緒山 まひろ 828

免费获取船舶轨迹数据?手把手教你用Python处理中国海洋卫星AIS数据

本文详细介绍了如何免费获取中国海洋卫星AIS数据,并使用Python进行船舶轨迹数据的处理与分析。从数据源评估到自动化处理流水线,再到高级分析与可视化技巧,手把手教你避开常见问题,实现高效数据处理。特别适合航运数据分析、物流优化和海上安全研究等领域的研究者和开发者。

weixin_42616115的博客 321

CentOS7无网环境实战:MySQL8.0完整离线安装与避坑指南(附依赖包下载)

本文详细介绍了在CentOS7无网环境下MySQL8.0的完整离线安装流程,包括依赖包获取、系统预处理、MySQL二进制安装、服务配置与优化等关键步骤。特别针对离线安装的特殊需求,提供了从依赖包下载到服务调优的全链路解决方案,帮助用户在企业内网或隔离环境中高效部署MySQL数据库。

bush的博客 176
上一篇: ACM详解(6)——栈
下一篇: ACM详解(8)——加密
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值