範例程式碼 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;
}