範例程式碼 uva828
//uva828
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char L[128];
char string[1024];
int N, n;
char ans[128];
int is_ans;
void sol (int index, int m, int ansLen) {
int len = strlen(L);
if (string[index] == '\0') {
ans[ansLen] == '\r';
return;
}
else if (string[index] == ' ') {
ans[ansLen] = ' ';
ansLen++;
index++;
}
if (string[index] == L[m % len] && string[index + 2] == L[(m + 1) % len]) {
int i;
int flag = 1;
for (i = 0; i < len; i++) {
if (string[index + 1] == (L[i] - 'A' + N) % 26 + 'A')
flag = 0;
}
if (!flag) {
ans[ansLen] = (string[index + 1] - N) < 'A' ? (string[index + 1] - N) + 26 : (string[index + 1] - N);
ansLen++;
m++;
index += 3;
sol(index, m, ansLen);
}
else
is_ans = 0;
}
else {
int i;
int flag = 1;
for (i = 0; i < len; i++) {
if (string[index] == (L[i] - 'A' + N) % 26 + 'A') {
flag = 0;
is_ans = 0;
break;
}
}
if (flag) {
ans[ansLen] = (string[index] - N) < 'A' ? (string[index] - N) + 26 : (string[index] - N);
ansLen++;
index++;
sol(index, m, ansLen);
}
}
}
int main(){
int count;
scanf("%d", &count);
while (count--) {
scanf("\n%[^\n]", &L);
scanf("%d %d", &N, &n);
int i;
for (i = 0; i < n; i++) {
memset(string, '\0', 1024);
memset(ans, '\0', 128);
getchar();
scanf("%[^\n]", string);
is_ans = 1;
sol(0, 0, 0);
if (is_ans == 0)
printf("error in encryption\n");
else
printf("%s\n", ans);
}
if (count)
printf("\n");
}
return 0;
}