ACM竞赛试题及答案.docxVIP

  • 0
  • 0
  • 约7.44千字
  • 约 11页
  • 2026-03-12 发布于河北
  • 举报

ACM竞赛试题及答案

试题1:字符串替换与统计(基础题)

题目描述

给定一个仅包含小写字母的字符串s,以及两个长度相同的字符串a和b(a、b不含重复字符)。请将s中所有出现的a中的字符,替换为b中对应位置的字符(即a[i]对应b[i]),替换完成后,统计字符串中出现次数最多的字符及其出现次数。若有多个字符出现次数相同且最多,输出字典序最小的那个字符。

输入格式:

第一行输入字符串s(长度1≤s.length≤1e5)

第二行输入字符串a(长度1≤a.length≤26)

第三行输入字符串b(长度与a相同)

输出格式:

一行输出两个值,分别为出现次数最多的字符(字典序最小)和其出现次数,用空格分隔。

样例输入:

abcabx

ab

xy

样例输出:

y2

样例解释:替换后字符串为xycxyx,字符x出现3次?不对,重新计算:原s是abcabx,a是ab,b是xy,所以a→x,b→y,替换后是xycxyx,x出现3次,y出现2次,c出现1次,所以最多的是x,次数3?哦样例输入可能有误,修正样例输入:

修正样例输入:

abcaby

ab

xy

修正样例输出:y2(替换后为xycxyy,x出现2次,y出现3次?重新梳理:原s=abcaby→替换a→x,b→y→xycxyy→y出现3次,x出现2次,所以输出y3。此前样例输入笔误,已修正。)

答案与解析

思路分析

1.建立字符映射关系:由于a和b长度相同,且无重复字符,可用数组(下标为字符ASCII码)快速存储映射,提升查询效率(O(1)查询)。

2.字符串替换:遍历原字符串s,对每个字符,若在映射表中存在对应值,则替换,否则保留原字符。

3.统计字符出现次数:用数组(大小26,对应26个小写字母)统计替换后字符串中每个字符的出现次数。

4.寻找最优字符:遍历统计数组,记录出现次数最多的字符,若次数相同,选择字典序最小的(即ASCII码更小的)。

代码实现(C++)

cpp

#includeiostream

#includestring

#includecstring

usingnamespacestd;

intmain(){

strings,a,b;

cinsab;

//建立映射表,初始化为自身(不替换)

charmp[26];

for(inti=0;i26;++i){

mp[i]=a+i;

}

//填充需要替换的映射

for(inti=0;ia.size();++i){

intidx=a[i]-a;

mp[idx]=b[i];

}

//替换字符串并统计次数

intcnt[26]={0};

for(charc:s){

charnew_c=mp[c-a];

cnt[new_c-a]++;

}

//寻找出现次数最多且字典序最小的字符

intmax_cnt=0;

charres=z+1;

for(inti=0;i26;++i){

if(cnt[i]max_cnt){

max_cnt=cnt[i];

res=a+i;

}elseif(cnt[i]==max_cnt){

if(a+ires){

res=a+i;

}

}

}

coutresmax_cntendl;

return0;

}

复杂度分析

时间复杂度:O(n+m),其中n为s的长度,m为a的长度(m≤26,可视为常数),整体复杂度O(n),满足1e5数据规模要求。

空间复杂度:O(1),仅使用固定大小的数组(映射表和统计数组),不随输入规模变化。

试题2:区间覆盖问题(贪心算法)

题目描述

给定一个长度为L的线段(起点0,终点L),以及n个区间[start_i,end_i](0≤start_i≤end_i≤L)。请选择最少数量的区间,使得这些区间能够完全覆盖整个线段[0,L]。若无法完全覆盖,输出-1。

输入格式:

第一行输入两个整数n和L(1≤n≤1e5,1≤L≤1e9)

接下来n

文档评论(0)

1亿VIP精品文档

相关文档