题目链接 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; } }