牛客网-W's Cipher【字符串操作】

给你三个数字k1,k2,k3,然后三组范围分别是1:[a,i],2:[j,r],3:[s-z]和下划线。在信息中的字符属于哪一组就向做移动ki个位置,只能在自己构成的组中移动,当然解密的话就是向右移动ki个位置,现在给你密文,让你输出原文。

记录每个字母属于哪个范围,然后对于每个范围进行相应的移动。

注意题目样例%95那里是错的,poj能过。

#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<algorithm>
#include<queue>
#include<cstdio>
using namespace std;

#define MAX 205
#define ll int
#define inf 100000000

int main() {
	ll k1, k2, k3; string s, res;
	vector<ll> v1, v2, v3;
	while (cin >> k1 >> k2 >> k3 && (k1 + k2 + k3)) {
		cin >> s; v1.clear(), v2.clear(), v3.clear();
		ll l = s.size();
		for (int i = 0; i < s.size(); i++) {
			if (s[i] >= 'a'&&s[i] <= 'i')v1.push_back(i);
			else if (s[i] >= 'j'&&s[i] <= 'r')v2.push_back(i);
			else v3.push_back(i);
		}
		res.clear();
		res = s;
		ll l1 = v1.size(), l2 = v2.size(), l3 = v3.size();
		for (int i = 0; i < l1; i++) {//第一类
			ll in = v1[i], out = v1[(i + k1) % l1];//该元素的位置以及要交换到的位置
			res[out] = s[in];
		}
		for (int i = 0; i < l2; i++) {
			ll in = v2[i], out = v2[(i + k2) % l2];//该元素的位置以及要交换到的位置
			res[out] = s[in];
		}
		for (int i = 0; i < l3; i++) {//第一类
			ll in = v3[i], out = v3[(i + k3) % l3];//该元素的位置以及要交换到的位置
			res[out] = s[in];
		}
		cout << res << endl;
	}
}
发布了269 篇原创文章 · 获赞 16 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/csyifanZhang/article/details/105641907