Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <cctype>
- #include <cstring>
- #include <ctime>
- #include <iostream>
- #include <algorithm>
- #include <vector>
- #include <deque>
- #include <list>
- #include <set>
- #include <map>
- #include <queue>
- #include <stack>
- #include <string>
- using namespace std;
- #define forn(i, n) for(int (i) = 0; (i) < (n); ++(i))
- #define mp make_pair
- #define vi vector<int>
- #define vvi vector<vector<int>>
- #define vvvi vector<vector<vector<int>>>
- #define pb push_back
- #define li long long
- #define geta(_type, _x, _n)\
- vector<_type> _x(_n);\
- for (int _i = 0; _i < _n; ++_i)\
- cin >> _x[_i];
- int check_r = 0;
- string rus, eng;
- vector<char> tobites(char c)
- {
- vector<char> ans(8);
- int k = 7;
- int r = (int)c + 128;
- while (r > 0)
- {
- if (r % 2 != 0)
- ans[k]++;
- r /= 2;
- k--;
- }
- return ans;
- }
- char tochar(vector<char> a)
- {
- char ans = -128;
- int k = 128;
- forn (i, 8)
- {
- if (a[i])
- ans += k;
- k /= 2;
- }
- return ans;
- }
- void code(string & s, string & key)
- {
- forn (i, s.length())
- {
- vector<char> v1, v2, v3(8);
- v1 = tobites(s[i]);
- v2 = tobites(key[i]);
- forn (j, 8)
- if ((!v1[j] && v2[j]) || (v1[j] && !v2[j]))
- v3[j]++;
- s[i] = tochar(v3);
- }
- }
- void decode(string & s, string & key)
- {
- forn (i, s.length())
- {
- vector<char> v1, v2, v3(8);
- v1 = tobites(s[i]);
- v2 = tobites(key[i]);
- forn (j, 8)
- v1[j] ? v3[j] = !v2[j] : v3[j] = v2[j];
- s[i] = tochar(v3);
- }
- }
- int main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- string s, key;
- for (char c = '!'; c <= '@'; c++)
- rus.pb(c), eng.pb(c);
- for (char c = 'a'; c <= 'z'; c++)
- eng.pb(c);
- for (char c = 'A'; c <= 'Z'; c++)
- eng.pb(c);
- for (char c = 'А'; c <= 'п'; c++)
- rus.pb(c);
- for (char c = 'р'; c <= 'я'; c++)
- rus.pb(c);
- int val, a, c;
- cin >> val >> a >> c >> check_r >> s;
- key.resize(s.length());
- key[0] = ((char)val);
- for (int i = 1; i < s.length(); ++i)
- {
- if (check_r)
- {
- int j;
- for (j = 0; j < rus.length(); ++j)
- if (key[i - 1] == rus[j])
- break;
- key[i] = rus[(a * j + c) % rus.length()];
- }
- else
- {
- int j;
- for (j = 0; j < eng.length(); ++j)
- if (key[i - 1] == eng[j])
- break;
- key[i] = eng[(a * j + c) % eng.length()];
- }
- }
- cout << "base str: " << s << endl << "key-str: " << key << endl << endl;
- code(s, key);
- cout << "code str: " << s << endl;
- decode(s, key);
- cout << "decode str: " << s << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement