第35次csp认证第二题

#include<iostream>
#include<map>
#include<vector>
#include<string>
using namespace std;

char trans[65];//0-25:A-Z  26-51:a-z  52-61:0-9 62:' ' 
int transnum[65];//由转换函数得到的从某字符开始到再次找到这个字符转换次数 
map<char, int> ch2int;



int main() {
	for (char ch = 'A';ch <= 'Z';ch++)
	{
		ch2int.insert({ ch,ch - 'A' });
	}
	for (char ch = 'a';ch <= 'z';ch++)
	{
		ch2int.insert({ ch,26+ch - 'a' });
	}
	for (char ch = '0';ch <= '9';ch++)
	{
		ch2int.insert({ ch,52+ch - '0' });
	}
	ch2int.insert({ ' ',62 });
	//完成字符到索引数的映射 
	string s;
	getline(cin, s);//初始字符串s

	int n;//转换串个数 
	vector<char> start;
	scanf_s("%d\n", &n);
	for (int i = 0;i < n;i++)
	{
		string temp ;
		getline(cin,temp);
		start.push_back(temp[1]);
		if (temp[1] == ' ')
			trans[62] = temp[2];
		if (temp[1] >= 'A' && temp[1] <= 'Z')
			trans[temp[1] - 'A'] = temp[2];
		if (temp[1] >= 'a' && temp[1] <= 'z')
			trans[26+temp[1] - 'a'] = temp[2];
		if (temp[1] >= '0' && temp[1] <= '9')
			trans[52+temp[1] - '0'] = temp[2];
	} //处理转换函数 
	for (int i = 0;i < n;i++)
	{
		for (auto it = start.begin();it != start.end();it++)
		{
			char ch_start = *it;
			int num = 0;
			while (trans[ch2int[ch_start]])
			{
				ch_start = trans[ch2int[ch_start]];
				num++;
				if (trans[ch2int[ch_start]] == *it)
				{
					transnum[ch2int[*it]] = num+1;
					break;
				}
			}
		}
	}

	int m;//查询个数 
	scanf_s("%d", &m);

	for (int i = 0;i < m;i++)
	{
		string ans = s;
		int q_num;//查询转换次数 
		cin >> q_num;
		for (int j = 1;j < s.length() - 1;j++)//对s每个字符进行转换处理 (首尾的#不处理)
		{
			int q_num_temp = q_num;
			char ch = s[j];
			if (transnum[ch2int[ch]]) {
				int short_q_num = q_num % transnum[ch2int[ch]];//有转换循环的字符,其转换次数取余后再计算 
				while (short_q_num--) {
					ch = trans[ch2int[ch]];//转换 
				}
				ans[j] = ch;
			}
			else {
				while (q_num_temp--)
				{
					if(trans[ch2int[ch]])
						ch = trans[ch2int[ch]];//转换 
				}
			}

			ans[j] = ch;
		}
		cout << ans << '\n';
	}
	return 0;
}

找变换的循环来减少一些字母在真正变换时的次数

用stl容器方便映射解题

注意getline与scanf、cin使用时需要对换行符进行处理!!!

全部评论

相关推荐

04-27 16:50
已编辑
门头沟学院 Java
1.&nbsp;mysql删除表语句是什么?drop和truncate区别?2.&nbsp;删除一行数据的sql3.&nbsp;查询一张表所有的数据的sql4.&nbsp;查询一张表有多少条数据sql。&nbsp;&nbsp;count(1)和count(*)区别5.&nbsp;i++和++i区别6.&nbsp;介绍下重载和重写。&nbsp;&nbsp;构造方法可以重写重载吗?7.&nbsp;arraylist和linkedlist的区别8.解释一下深拷贝和浅拷贝9.&nbsp;如果有三个线程,我如何能保证顺序执行.方法1:&nbsp;使用join()join()&nbsp;方法可以确保一个线程在另一个线程执行完毕后才开始执行。通过合理地调用&nbsp;join(),可以实现线程的顺序执行。方法2:使用countdownlatch/semaphore方法3:&nbsp;使用锁和原子类,wait()&nbsp;+&nbsp;notifyAll()方法4:&nbsp;使用completablefuture10.&nbsp;如果有一个&nbsp;T1&nbsp;线程,想把&nbsp;T2&nbsp;线程加到&nbsp;T1&nbsp;里面,怎么实现?方法1.&nbsp;使用join()Thread t2 = new Thread(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T2&nbsp;线程的执行逻辑&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程正在执行&quot;);});Thread t1 = new Thread(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T1&nbsp;线程开始执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T1&nbsp;线程在此处等待&nbsp;T2&nbsp;线程执行完成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.start();&nbsp;&nbsp;//&nbsp;启动&nbsp;T2&nbsp;线程&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.join();&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T1&nbsp;等待&nbsp;T2&nbsp;完成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程已完成,T1&nbsp;继续执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;}});t1.start();方法2.&nbsp;使用future.get()ExecutorService&nbsp;executor&nbsp;=&nbsp;Executors.newSingleThreadExecutor();Future future = executor.submit(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T2&nbsp;线程的执行逻辑&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程正在执行&quot;);});Thread t1 = new Thread(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T1&nbsp;线程开始执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;T1&nbsp;线程在此处等待&nbsp;T2&nbsp;线程执行完成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;future.get();&nbsp;&nbsp;//&nbsp;阻塞直到&nbsp;T2&nbsp;完成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程已完成,T1&nbsp;继续执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;|&nbsp;ExecutionException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor.shutdown();&nbsp;&nbsp;&nbsp;&nbsp;}});t1.start();方法3.&nbsp;使用countdownlatchCountDownLatch&nbsp;latch&nbsp;=&nbsp;new&nbsp;CountDownLatch(1);Thread t2 = new Thread(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程正在执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;finally&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.countDown();&nbsp;&nbsp;//&nbsp;完成时减少计数&nbsp;&nbsp;&nbsp;&nbsp;}});Thread t1 = new Thread(() ->&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T1&nbsp;线程开始执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t2.start();&nbsp;&nbsp;//&nbsp;启动&nbsp;T2&nbsp;线程&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.await();&nbsp;&nbsp;//&nbsp;等待&nbsp;T2&nbsp;完成&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;T2&nbsp;线程已完成,T1&nbsp;继续执行&quot;);&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;}});t1.start();11.&nbsp;a=a+b&nbsp;和&nbsp;a+=b的区别a&nbsp;=&nbsp;a&nbsp;+&nbsp;b,如果&nbsp;a&nbsp;和&nbsp;b&nbsp;的类型不同(如&nbsp;a&nbsp;是&nbsp;int,b&nbsp;是&nbsp;double),需要显式强制类型转换,否则会编译报错。即:double&nbsp;a=&nbsp;1;int&nbsp;b&nbsp;=&nbsp;2;a&nbsp;=&nbsp;(double)&nbsp;(a+b);&nbsp;a&nbsp;+=&nbsp;b,会自动执行隐式类型转换,将结果转换为&nbsp;a&nbsp;的类型。13.&nbsp;数据库的三大范式如答案有错误欢迎指正
查看24道真题和解析
点赞 评论 收藏
分享
04-24 10:14
已编辑
重庆邮电大学 Java
●&nbsp;岗位描述:Bravo&nbsp;102是由阿里国际技术全团队共同发起的技术人才孵化计划,打破传统人才选拔及培养框架,为有志于走向AI未来的技术新锐们,提供“你行你上+我要我来”的双向奔赴式的实习机会选择。&nbsp;在这里,“我”将不被岗位定义,以能力选择业务战场,与全球顶尖团队并肩作战,沉浸式体验全球多元化业务战场与亿级流量高并发系统。&nbsp;加入我们,成为AIDC首批102位Bravo&nbsp;Talent,一起掌舵AI,为我们的未来Bravo!&nbsp;关于我们:&nbsp;阿里国际技术专注于提供卓越的数字零售技术服务,致力于服务全球消费者,并触达全球中小企业买家。我们希望利用AI技术让每个人都能够轻松、便捷地享受全球优质的商品和服务,推动商业活动更加高效、可持续,为社会未来的发展带来更多可能性。&nbsp;我们提供涵盖商品智能、商家服务、供应链优化、跨境物流、搜索推荐引擎、用户增长、金融服务、客户体验、AI&nbsp;基础设施、企业数智化、全球云及高可用架构、研发效能等技术领域,实习生可跨多个技术域实践,深度参与多场景技术攻坚,探索你想选择的职业发展方向;&nbsp;在这里,你将和我们一起,采用领先的数字化及人工智能等技术持续解决商业活动中的现实问题,创造技术价值,为消费者带来更加美好的体验!欢迎加入我们!●&nbsp;工作职责:&nbsp;1、参与基础软件的设计、开发和维护,如分布式文件系统、缓存系统、Key/Value&nbsp;存储系统、数据库、Linux&nbsp;操作系统等,探索&nbsp;AI&nbsp;在系统调优中的应用(如通过机器学习预测热点数据提升缓存命中率);&nbsp;2、参与国际电商系统及基础设施的核心模块开发,集成&nbsp;AI&nbsp;模型服务,为公司产品提供强有力的后台支持,设计并实施最强大的解决方案;&nbsp;3、参与产品的开发和维护,完成从需求到设计、开发和上线等整个项目周期内的工作,能够通过&nbsp;AI&nbsp;工具提升开发效率;4、参与海量数据处理和开发,使用Java/SQL/Python开发&nbsp;ETL&nbsp;流程,结合大模型实现数据清洗与特征工程自动化(如利用大模型生成&nbsp;SQL&nbsp;查询模板);&nbsp;5、参与项目为用户提供丰富而有价值的桌面或无线软件产品,能够探索&nbsp;AI&nbsp;在业务场景的落地应用(如大模型在供应链定价、销量计划、库存、履约等复杂场景的智能洞察和协同,基于大模型的个性化推荐系统,交互式智能导购,需求预测模型部署,异常检测算法实现等)。●&nbsp;岗位要求基础能力:学科成绩优异;代码能力出色:代码思路具备一定逻辑性,熟练使用常见的设计模式,输出高高质量代码(可读性、可理解性);专业成果:竞赛或论文产出:专业领域内知名会议或期刊发表过学术论文,担任一作/学生一作/共&nbsp;—,或专利/软著;开源社区贡献:在GitHub等开源社区具备有较大影响力的技术项目&nbsp;(star&nbsp;X),作为collaborate/committer/menber优先;实习经历:校内/校外项目深入了解并积极实践相关技术在实际场景的应用,能够独立应用技术解决问题有意向广州的欢迎私信勾搭,绝对核心组,也可做AI相关研发
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务