#include <iostream>
#include <string>
#include <cctype>
using namespace std;
string vigenere(string text, string key, bool decrypt = false) {
string result = "";
int j = 0;
int dir = decrypt ? -1 : 1;
// Make key uppercase
for (char &c : key) c = toupper(c);
for (char c : text) {
if (isalpha(c)) {
char base = isupper(c) ? 'A' : 'a';
int shift = key[j % key.size()] - 'A';
result += (c - base + dir * shift + 26) % 26 + base;
j++;
} else {
result += c;
}
}
return result;
}
int main() {
string key, msg;
cout << "Enter key: ";
cin >> key;
cin.ignore();
cout << "Enter message: ";
getline(cin, msg);
string enc = vigenere(msg, key);
string dec = vigenere(enc, key, true);
cout << "Encrypted: " << enc << endl;
cout << "Decrypted: " << dec << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2N0eXBlPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RyaW5nIHZpZ2VuZXJlKHN0cmluZyB0ZXh0LCBzdHJpbmcga2V5LCBib29sIGRlY3J5cHQgPSBmYWxzZSkgewogICAgc3RyaW5nIHJlc3VsdCA9ICIiOwogICAgaW50IGogPSAwOwogICAgaW50IGRpciA9IGRlY3J5cHQgPyAtMSA6IDE7CgogICAgLy8gTWFrZSBrZXkgdXBwZXJjYXNlCiAgICBmb3IgKGNoYXIgJmMgOiBrZXkpIGMgPSB0b3VwcGVyKGMpOwoKICAgIGZvciAoY2hhciBjIDogdGV4dCkgewogICAgICAgIGlmIChpc2FscGhhKGMpKSB7CiAgICAgICAgICAgIGNoYXIgYmFzZSA9IGlzdXBwZXIoYykgPyAnQScgOiAnYSc7CiAgICAgICAgICAgIGludCBzaGlmdCA9IGtleVtqICUga2V5LnNpemUoKV0gLSAnQSc7CiAgICAgICAgICAgIHJlc3VsdCArPSAoYyAtIGJhc2UgKyBkaXIgKiBzaGlmdCArIDI2KSAlIDI2ICsgYmFzZTsKICAgICAgICAgICAgaisrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCArPSBjOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gcmVzdWx0Owp9CgppbnQgbWFpbigpIHsKICAgIHN0cmluZyBrZXksIG1zZzsKCiAgICBjb3V0IDw8ICJFbnRlciBrZXk6ICI7CiAgICBjaW4gPj4ga2V5OwogICAgY2luLmlnbm9yZSgpOwoKICAgIGNvdXQgPDwgIkVudGVyIG1lc3NhZ2U6ICI7CiAgICBnZXRsaW5lKGNpbiwgbXNnKTsKCiAgICBzdHJpbmcgZW5jID0gdmlnZW5lcmUobXNnLCBrZXkpOwogICAgc3RyaW5nIGRlYyA9IHZpZ2VuZXJlKGVuYywga2V5LCB0cnVlKTsKCiAgICBjb3V0IDw8ICJFbmNyeXB0ZWQ6ICIgPDwgZW5jIDw8IGVuZGw7CiAgICBjb3V0IDw8ICJEZWNyeXB0ZWQ6ICIgPDwgZGVjIDw8IGVuZGw7CgogICAgcmV0dXJuIDA7Cn0K