1. 程式人生 > >PAT-ADVANCED1077——Kuchiguse

PAT-ADVANCED1077——Kuchiguse

題目描述:

題目翻譯:

1077 口頭禪

日語因其句子結尾部分而臭名昭著。這種結尾部分的個人偏好可以被視為說話者個性的反映。這種偏好被稱為“Kuchiguse”,在動漫和漫畫中經常被誇大。例如,人為地在句子結束部分加上“nyan~”經常被用作具有貓般個性的角色的刻板印象:

        Itai nyan~(好痛,nyan~)

        Ninjin wa iyada nyan~(我討厭胡蘿蔔,nyan~)

現在給出同一個角色說的幾句話,你能找到她的Kuchiguse嗎?

輸入格式:

每個輸入檔案包含一個測試用例。對於每個測試用例,第一行是整數N(2 <= N <= 100)。接下來N行,每行是包含0~256(含)個字元的字串,每個字串代表一個人的一句話。每行區分大小寫。

輸出格式:

對於每個測試用例,在一行中列印字串的“kuchiguse”,即所有N行的最長公共字尾。如果沒有這樣的字尾,列印nai。

輸入樣例1:

3
Itai nyan~
Ninjin wa iyadanyan~
uhhh nyan~

輸出樣例1:

nyan~

輸入樣例2:

3
Itai!
Ninjinnwaiyada T_T
T_T

輸出樣例2:

nai

知識點:字串

思路:對每個字串翻轉後求其最長公共字尾

PAT不支援使用cstring標頭檔案中的strrev函式,因此需要我們自己寫一個翻轉字串的函式。

時間複雜度和空間複雜度均是O(N)。

C++程式碼:

#include<iostream>
#include<cstring>

void reverse(char* str, int N);

int main() {
	int N;
	scanf("%d", &N);
	getchar();
	char input[N][257];
	for(int i = 0; i < N; i++) {
		scanf("%[^\n]", input[i]);
		reverse(input[i], strlen(input[i]));
		getchar();
	}
	char result[257];
	int index = 0;
	while(true) {
		bool flag = true;
		for(int i = 0; i < N - 1; i++) {
			if(index >= strlen(input[i]) || index >= strlen(input[i + 1]) || input[i][index] != input[i + 1][index]) {
				flag = false;
			}
		}
		if(!flag){
			break;
		}
		result[index] = input[0][index];
		index++;
	}
	result[index] = '\0';
	reverse(result, strlen(result));
	if(strlen(result) == 0){
		printf("nai\n");
	}else{
		printf("%s\n", result);
	} 
	return 0;
}

void reverse(char* str, int N){
	for(int i = 0; i < N / 2; i++){
		char temp = *(str + i);
		*(str + i) = *(str + N - i - 1);
		*(str + N - i - 1) = temp;
	}
}

C++解題報告: