#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main() {
int n;
char s[1005][205];
for (int i = 0; i < n; i++) {
}
// 第一階段:找最長公共前綴
char prefix[205];
for (int i = 1; i < n; i++) {
int j = 0;
while (prefix[j] && s[i][j] && prefix[j] == s[i][j])
j++;
prefix[j] = '\0';
if (prefix[0] == '\0')
break;
}
// 第二階段:維吉尼亞解密
char ciphertext[10005];
scanf(" %[^\n]", ciphertext
);
int prefix_len
= strlen(prefix
); int cipher_len
= strlen(ciphertext
);
if (prefix_len == 0) {
// 如果沒有公共前綴,無法解密
} else {
char plaintext[10005];
int key_index = 0; // 獨立的 key 索引,只在處理字母時增加
for (int i = 0; i < cipher_len; i++) {
char c = ciphertext[i];
// 大寫字母解密
char key_char
= tolower(prefix
[key_index
% prefix_len
]); int shift = key_char - 'a';
plaintext[i] = ((c - 'A' - shift + 26) % 26) + 'A';
key_index++; // 只有處理字母時才移動 key
// 小寫字母解密
char key_char
= tolower(prefix
[key_index
% prefix_len
]); int shift = key_char - 'a';
plaintext[i] = ((c - 'a' - shift + 26) % 26) + 'a';
key_index++; // 只有處理字母時才移動 key
} else {
// 非字母字符保持不變,不消耗 key
plaintext[i] = c;
}
}
plaintext[cipher_len] = '\0';
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiAKaW50IG1haW4oKSB7CiAgICBpbnQgbjsKICAgIHNjYW5mKCIlZCIsICZuKTsKICAgIGNoYXIgc1sxMDA1XVsyMDVdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKICAgICAgICBzY2FuZigiJXMiLCBzW2ldKTsKICAgIH0KIAogICAgLy8g56ys5LiA6ZqO5q6177ya5om+5pyA6ZW35YWs5YWx5YmN57a0CiAgICBjaGFyIHByZWZpeFsyMDVdOwogICAgc3RyY3B5KHByZWZpeCwgc1swXSk7CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykgewogICAgICAgIGludCBqID0gMDsKICAgICAgICB3aGlsZSAocHJlZml4W2pdICYmIHNbaV1bal0gJiYgcHJlZml4W2pdID09IHNbaV1bal0pCiAgICAgICAgICAgIGorKzsKICAgICAgICBwcmVmaXhbal0gPSAnXDAnOwogICAgICAgIGlmIChwcmVmaXhbMF0gPT0gJ1wwJykKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBwcmludGYoIiVzXG4iLCBwcmVmaXgpOwogCiAgICAvLyDnrKzkuozpmo7mrrXvvJrntq3lkInlsLzkup7op6Plr4YKICAgIGNoYXIgY2lwaGVydGV4dFsxMDAwNV07CiAgICBzY2FuZigiICVbXlxuXSIsIGNpcGhlcnRleHQpOyAKIAogICAgaW50IHByZWZpeF9sZW4gPSBzdHJsZW4ocHJlZml4KTsKICAgIGludCBjaXBoZXJfbGVuID0gc3RybGVuKGNpcGhlcnRleHQpOwogCiAgICBpZiAocHJlZml4X2xlbiA9PSAwKSB7CiAgICAgICAgLy8g5aaC5p6c5rKS5pyJ5YWs5YWx5YmN57a077yM54Sh5rOV6Kej5a+GCiAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBjaGFyIHBsYWludGV4dFsxMDAwNV07CiAgICAgICAgaW50IGtleV9pbmRleCA9IDA7ICAvLyDnjajnq4vnmoQga2V5IOe0ouW8le+8jOWPquWcqOiZleeQhuWtl+avjeaZguWinuWKoAogCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaXBoZXJfbGVuOyBpKyspIHsKICAgICAgICAgICAgY2hhciBjID0gY2lwaGVydGV4dFtpXTsKIAogICAgICAgICAgICBpZiAoaXN1cHBlcihjKSkgewogICAgICAgICAgICAgICAgLy8g5aSn5a+r5a2X5q+N6Kej5a+GCiAgICAgICAgICAgICAgICBjaGFyIGtleV9jaGFyID0gdG9sb3dlcihwcmVmaXhba2V5X2luZGV4ICUgcHJlZml4X2xlbl0pOwogICAgICAgICAgICAgICAgaW50IHNoaWZ0ID0ga2V5X2NoYXIgLSAnYSc7CiAgICAgICAgICAgICAgICBwbGFpbnRleHRbaV0gPSAoKGMgLSAnQScgLSBzaGlmdCArIDI2KSAlIDI2KSArICdBJzsKICAgICAgICAgICAgICAgIGtleV9pbmRleCsrOyAgLy8g5Y+q5pyJ6JmV55CG5a2X5q+N5pmC5omN56e75YuVIGtleQogICAgICAgICAgICB9IGVsc2UgaWYgKGlzbG93ZXIoYykpIHsKICAgICAgICAgICAgICAgIC8vIOWwj+Wvq+Wtl+avjeino+WvhgogICAgICAgICAgICAgICAgY2hhciBrZXlfY2hhciA9IHRvbG93ZXIocHJlZml4W2tleV9pbmRleCAlIHByZWZpeF9sZW5dKTsKICAgICAgICAgICAgICAgIGludCBzaGlmdCA9IGtleV9jaGFyIC0gJ2EnOwogICAgICAgICAgICAgICAgcGxhaW50ZXh0W2ldID0gKChjIC0gJ2EnIC0gc2hpZnQgKyAyNikgJSAyNikgKyAnYSc7CiAgICAgICAgICAgICAgICBrZXlfaW5kZXgrKzsgIC8vIOWPquacieiZleeQhuWtl+avjeaZguaJjeenu+WLlSBrZXkKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIOmdnuWtl+avjeWtl+espuS/neaMgeS4jeiuiu+8jOS4jea2iOiAlyBrZXkKICAgICAgICAgICAgICAgIHBsYWludGV4dFtpXSA9IGM7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcGxhaW50ZXh0W2NpcGhlcl9sZW5dID0gJ1wwJzsKICAgICAgICBwcmludGYoIiVzXG4iLCBwbGFpbnRleHQpOwogICAgfQogCiAgICByZXR1cm4gMDsKfQ==