#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];
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+CgppbnQgbWFpbigpIHsKICAgIGludCBuOwogICAgc2NhbmYoIiVkIiwgJm4pOwogICAgY2hhciBzWzEwMDVdWzIwNV07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHNjYW5mKCIlcyIsIHNbaV0pOwogICAgfQogICAgCiAgICAvLyDnrKzkuIDpmo7mrrXvvJrmib7mnIDplbflhazlhbHliY3ntrQKICAgIGNoYXIgcHJlZml4WzIwNV07CiAgICBzdHJjcHkocHJlZml4LCBzWzBdKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgaW50IGogPSAwOwogICAgICAgIHdoaWxlIChwcmVmaXhbal0gJiYgc1tpXVtqXSAmJiBwcmVmaXhbal0gPT0gc1tpXVtqXSkKICAgICAgICAgICAgaisrOwogICAgICAgIHByZWZpeFtqXSA9ICdcMCc7CiAgICAgICAgaWYgKHByZWZpeFswXSA9PSAnXDAnKQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIHByaW50ZigiJXNcbiIsIHByZWZpeCk7CiAgICAKICAgIC8vIOesrOS6jOmajuaute+8mue2reWQieWwvOS6nuino+WvhgogICAgY2hhciBjaXBoZXJ0ZXh0WzEwMDA1XTsKICAgIHNjYW5mKCIlcyIsIGNpcGhlcnRleHQpOwogICAgCiAgICBpbnQgcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOwogICAgaW50IGNpcGhlcl9sZW4gPSBzdHJsZW4oY2lwaGVydGV4dCk7CiAgICAKICAgIGlmIChwcmVmaXhfbGVuID09IDApIHsKICAgICAgICAvLyDlpoLmnpzmspLmnInlhazlhbHliY3ntrTvvIznhKHms5Xop6Plr4YKICAgICAgICBwcmludGYoIlxuIik7CiAgICB9IGVsc2UgewogICAgICAgIGNoYXIgcGxhaW50ZXh0WzEwMDA1XTsKICAgICAgICBpbnQga2V5X2luZGV4ID0gMDsgIC8vIOeNqOeri+eahCBrZXkg57Si5byV77yM5Y+q5Zyo6JmV55CG5a2X5q+N5pmC5aKe5YqgCiAgICAgICAgCiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaXBoZXJfbGVuOyBpKyspIHsKICAgICAgICAgICAgY2hhciBjID0gY2lwaGVydGV4dFtpXTsKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChpc3VwcGVyKGMpKSB7CiAgICAgICAgICAgICAgICAvLyDlpKflr6vlrZfmr43op6Plr4YKICAgICAgICAgICAgICAgIGNoYXIga2V5X2NoYXIgPSB0b2xvd2VyKHByZWZpeFtrZXlfaW5kZXggJSBwcmVmaXhfbGVuXSk7CiAgICAgICAgICAgICAgICBpbnQgc2hpZnQgPSBrZXlfY2hhciAtICdhJzsKICAgICAgICAgICAgICAgIHBsYWludGV4dFtpXSA9ICgoYyAtICdBJyAtIHNoaWZ0ICsgMjYpICUgMjYpICsgJ0EnOwogICAgICAgICAgICAgICAga2V5X2luZGV4Kys7ICAvLyDlj6rmnInomZXnkIblrZfmr43mmYLmiY3np7vli5Uga2V5CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNsb3dlcihjKSkgewogICAgICAgICAgICAgICAgLy8g5bCP5a+r5a2X5q+N6Kej5a+GCiAgICAgICAgICAgICAgICBjaGFyIGtleV9jaGFyID0gdG9sb3dlcihwcmVmaXhba2V5X2luZGV4ICUgcHJlZml4X2xlbl0pOwogICAgICAgICAgICAgICAgaW50IHNoaWZ0ID0ga2V5X2NoYXIgLSAnYSc7CiAgICAgICAgICAgICAgICBwbGFpbnRleHRbaV0gPSAoKGMgLSAnYScgLSBzaGlmdCArIDI2KSAlIDI2KSArICdhJzsKICAgICAgICAgICAgICAgIGtleV9pbmRleCsrOyAgLy8g5Y+q5pyJ6JmV55CG5a2X5q+N5pmC5omN56e75YuVIGtleQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8g6Z2e5a2X5q+N5a2X56ym5L+d5oyB5LiN6K6K77yM5LiN5raI6ICXIGtleQogICAgICAgICAgICAgICAgcGxhaW50ZXh0W2ldID0gYzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBwbGFpbnRleHRbY2lwaGVyX2xlbl0gPSAnXDAnOwogICAgICAgIHByaW50ZigiJXNcbiIsIHBsYWludGV4dCk7CiAgICB9CiAgICAKICAgIHJldHVybiAwOwp9