A1077. Kuchiguse

The Japanese language is notorious for its sentence ending particles. Personal preference of such particles can be considered as a reflection of the speaker's personality. Such a preference is called "Kuchiguse" and is often exaggerated artistically in Anime and Manga. For example, the artificial sentence ending particle "nyan~" is often used as a stereotype for characters with a cat-like personality:

  • Itai nyan~ (It hurts, nyan~)
  • Ninjin wa iyada nyan~ (I hate carrots, nyan~)

Now given a few lines spoken by the same character, can you find her Kuchiguse?

Input Specification:

Each input file contains one test case. For each case, the first line is an integer N (2<=N<=100). Following are N file lines of 0~256 (inclusive) characters in length, each representing a character's spoken line. The spoken lines are case sensitive.

Output Specification:

For each test case, print in one line the kuchiguse of the character, i.e., the longest common suffix of all N lines. If there is no such suffix, write "nai".

Sample Input 1:

3
Itai nyan~
Ninjin wa iyadanyan~
uhhh nyan~

Sample Output 1:

nyan~

Sample Input 2:

3
Itai!
Ninjinnwaiyada T_T
T_T

Sample Output 2:

nai

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<string.h>
 5 using namespace std;
 6 void rev(char a[]){
 7     int len = strlen(a);
 8     for(int i = 0; i < len / 2; i++)
 9         swap(a[i],a[len - 1 - i]);
10 }
11 int main(){
12     int N, minL = 99999, tag = 1, len = 0;
13     char str[100][1000], sen[1000];
14     scanf("%d", &N);
15     getchar();
16     for(int i = 0; i < N; i++){
17         gets(str[i]);
18         rev(str[i]);
19         if(minL > strlen(str[i]))
20             minL = strlen(str[i]);
21     }
22     for(int i = 0; i < minL; i++){
23         char c = str[0][i];
24         for(int j = 0; j < N; j++)
25             if(str[j][i] != c){
26                 tag = 0;
27                 break;
28             }
29         if(tag == 0)
30             break;
31         len++;
32     }
33     if(len != 0)
34         for(int j = len - 1; j >= 0; j--)
35             printf("%c", str[0][j]);
36     else
37         printf("nai");
38     cin >> N;
39     return 0;
40 }
View Code

总结:

1、本题即求公共后缀,由于每个字符串长度不一,可以在输入字符串后逆序,转换为求公共前缀。

2、关于字符串的处理,本题无法使用scanf的%s读入字符串,因为字符串中存在空格。所以可以用gets(),在遇到回车时结束。但要注意,在scanf读入N后,还存在一个回车键,需要被吸收掉,否则会导致gets()读到一个回车空串。

3、由于PAT不支持gets()读入带空格的一行。以后遇到复杂的字符串题时,使用string而不是char[]。

原文地址:https://www.cnblogs.com/zhuqiwei-blog/p/8442855.html