2020 CCPC Wannafly Winter Camp Day1 Div.1&2 B.密码学

题目链接 https://ac.nowcoder.com/acm/contest/3979/B

题意:给你n个字符串,再给你m个操作,xi,yi, 意思是用是s[xi]来加密s[yi],加密方法是(s[xi]+s[yi]) %52.加密后的替换原理的s[yi];

题解:先用一个二维数组存下所有的操作,然后再倒还原就可以了

#include<iostream>
#include<string>
#include <cstdlib>
#include <algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<bitset>
#include <iomanip>

// #pragma comment(linker, "/STACK:1024000000,1024000000")
// #define pi acos(-1)
// #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INF 0x7f7f7f7f //2139062143
#define INF1 0x3f3f3f3f //1061109567
#define INF2 2147483647
#define llINF 9223372036854775807
#define pi 3.141592653589793//23846264338327950254
#define pb push_back
#define ll long long
#define debug cout << "debug\n";
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
// ios::sync_with_stdio(false);cin.tie(NULL);
#define scai(x) scanf("%d", &x)
#define sca2i(x, y) scanf("%d %d", &x, &y)
#define scaf(x) scanf("%lf", &x)
#define sca2f(x, y) scanf("%lf %lf", &x, &y)
#define For(m,n) for (int i = m;  i < n; i++)

#define local
#ifdef local
#endif
const int N = 1e5 + 2;

int a[1000];
// 用数组的方式构建一个映射
void init() { int j = 0; int i = 0; for (i = 'a'; i <= 'z'; i++, j++) { a[i] = j; } j = 'a'; for (i = 0; i < 26; i++,j++) { a[i] = j; } j = 26; for (i = 'A'; i <= 'Z'; i++, j++) { a[i] = j; } j = 'A'; for (i = 26; i < 52; i++,j++) { a[i] = j; } } string s[1005]; int op[1003][2]; int main() { init(); int i; /*for(i = 0; i < 123; i++) printf("%d %d\n", i, a[i]);*/ int n, m; cin >> n>> m; for (int i = 0; i < m; i++) // 先存下所有加密操作 { cin >> op[i][0] >> op[i][1]; op[i][0]--; op[i][1]--; } for (int i = 0; i < n; i++) { cin >> s[i]; } for (int i = m - 1; i >= 0; i--) { string t1 = s[op[i][0]]; string t2 = s[op[i][1]]; //cout << t1 <<endl << t2 << endl; while (t1.size() < t2.size()) // 如果加密代码太短,就在后面复制一段 t1.append(t1); int len2 = t2.size(); for (int i = 0; i < len2; i++) { t2[i] = a[(a[t2[i]] + 104 - a[t1[i]]) %52]; /*if (a[t2[i]] > a[t1[i]]) { t2[i] = a[a[t2[i]] - a[t1[i]]]; } else t2[i] = a[a[t2[i]] + 52 - a[t1[i]]];*/ } s[op[i][1]] = t2.substr(0, t2.size()); // 留下与原长一样的字符串替换加密字符串 } for (int i = 0; i < n; i++) { cout << s[i] << endl; } }

猜你喜欢

转载自www.cnblogs.com/hulian425/p/12219012.html
今日推荐