第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使用时需要对换行符进行处理!!!

全部评论

相关推荐

06-12 11:51
已编辑
门头沟学院 Java
1.&nbsp;反射的原理是什么?2.&nbsp;类加载时,类和实例分别加载到哪里?3.&nbsp;什么是好的编程方法或方案?4.&nbsp;SQL&nbsp;语句优化有哪些方法?5.&nbsp;订单生成&nbsp;ID&nbsp;的实现方式是什么?6.&nbsp;如何处理时间回拨问题?7.&nbsp;雪花算法的基本原理是什么?8.&nbsp;如何设计一个简单的&nbsp;IOC&nbsp;容器?9.&nbsp;自动装箱和拆箱的底层实现是什么?10.&nbsp;Java&nbsp;中的线程安全是什么意思?11.&nbsp;什么是&nbsp;TLAB(Thread&nbsp;Local&nbsp;Allocation&nbsp;Buffer)?12.&nbsp;NIO&nbsp;的基本概念是什么?13.&nbsp;ConcurrentHashMap&nbsp;中锁的机制是什么?14.&nbsp;一条&nbsp;SQL&nbsp;语句在&nbsp;MySQL&nbsp;中的执行过程是怎样的?15.&nbsp;MySQL&nbsp;中事务的日志记录是如何实现的?16.&nbsp;如何通过代码实现死锁?17.&nbsp;接口和抽象类的区别是什么?18.&nbsp;接口和抽象类在设计模式中的体现有哪些?19.&nbsp;String、StringBuilder&nbsp;和&nbsp;StringBuffer&nbsp;的区别是什么?20.&nbsp;final&nbsp;关键字的作用是什么?21.&nbsp;THREAD&nbsp;LOCAL&nbsp;可能引发的内存泄漏问题是什么?22.&nbsp;THREAD&nbsp;LOCAL&nbsp;的应用场景有哪些?23.&nbsp;如何将父线程的&nbsp;THREAD&nbsp;LOCAL&nbsp;值传递给子线程?24.&nbsp;对&nbsp;Java&nbsp;面向对象的理解是什么?25.&nbsp;面向对象和面向过程的区别是什么?26.&nbsp;Java&nbsp;中创建对象的方式有哪些?27.&nbsp;Java&nbsp;中序列化与反序列化的概念是什么?28.&nbsp;Redis&nbsp;中使用哈希存储对象和直接使用字符串存储对象的区别是什么?29.&nbsp;Java&nbsp;中参数传递是按值传递还是按引用传递?30.&nbsp;多继承可能带来的问题是什么?31.&nbsp;方法重载与方法重写的区别是什么?32.&nbsp;Java&nbsp;内部类的概念和作用是什么?33.&nbsp;JDK&nbsp;8&nbsp;的新特性有哪些?34.&nbsp;JRE&nbsp;和&nbsp;JDK&nbsp;的区别是什么?35.&nbsp;JDK&nbsp;中常用的工具类有哪些?36.&nbsp;Hashcode&nbsp;的作用是什么?37.&nbsp;TreeSet&nbsp;集合在加入一个对象时如何判断该对象是否存在?38.&nbsp;是否可能两个不相等的对象有相同的哈希值?39.&nbsp;Java&nbsp;中的&nbsp;hashCode&nbsp;和&nbsp;equals&nbsp;方法有什么区别?40.&nbsp;什么是&nbsp;Java&nbsp;中的动态代理?41.&nbsp;动态代理与静态代理的区别是什么?42.&nbsp;注解的原理是什么?43.&nbsp;SPI&nbsp;机制的作用是什么?44.&nbsp;泛型的作用是什么?45.&nbsp;什么是泛型擦除?46.&nbsp;深拷贝和浅拷贝的区别是什么?47.&nbsp;Integer&nbsp;类型的缓存池是如何工作的?48.&nbsp;Java&nbsp;程序的运行过程是怎样的?49.&nbsp;new&nbsp;一个&nbsp;String&nbsp;类型的对象时会创建多少个对象?50.&nbsp;final、finally&nbsp;和&nbsp;finalize&nbsp;的区别是什么?51.&nbsp;Java&nbsp;的基本类型有哪些?52.&nbsp;静态方法和实例方法的区别是什么?53.&nbsp;for-each&nbsp;循环实现的接口或集合类型是什么?54.&nbsp;RandomAccess&nbsp;接口的作用是什么?55.&nbsp;迭代器(Iterator)的工作原理是什么?56.&nbsp;ArrayList&nbsp;和&nbsp;LinkedList&nbsp;的区别是什么?57.&nbsp;为什么需要&nbsp;ArrayList&nbsp;而不是直接使用数组?58.&nbsp;数组和链表在&nbsp;Java&nbsp;中的区别是什么?59.&nbsp;ArrayList&nbsp;的扩容机制是怎样的?60.&nbsp;ArrayList&nbsp;的缺点有哪些?如何使其线程安全?61.&nbsp;如何使一个集合不可修改?62.&nbsp;使用&nbsp;HashMap&nbsp;时有哪些提升性能的技巧?63.&nbsp;什么是哈希碰撞?在&nbsp;HashMap&nbsp;中如何解决哈希碰撞?64.&nbsp;HashMap&nbsp;的&nbsp;put&nbsp;方法执行流程是怎样的?65.&nbsp;为什么&nbsp;HashMap&nbsp;在扩容时总是以&nbsp;2&nbsp;的&nbsp;n&nbsp;次方倍增长?66.&nbsp;ConcurrentHashMap&nbsp;在&nbsp;get&nbsp;方法中是否需要加锁?67.&nbsp;为什么&nbsp;HashMap&nbsp;不支持&nbsp;key&nbsp;或&nbsp;value&nbsp;为&nbsp;null?68.&nbsp;Java&nbsp;中如何创建多线程?69.&nbsp;线程池的工作原理是什么?70.&nbsp;Java&nbsp;中的线程是如何进行通信的?71.&nbsp;join&nbsp;方法的原理是什么?72.&nbsp;主线程如何知道子线程创建成功?73.&nbsp;反射的原理是什么?74.&nbsp;Java&nbsp;内存模型是什么?如何保证可见性和有序性?75.&nbsp;final&nbsp;关键字是否能够保证变量的可见性?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务