PAT A1077 Kuchiguse (20 分)
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
以下是AC的代码:
#include<cstdio>
#include<cstring>
#define len 260
char words[len][len];
void revers(char a[]){
int lens=strlen(a);
for(int i=0;i<lens/2;i++){
char temp=a[i];
a[i]=a[lens-1-i];
a[lens-1-i]=temp;
}
}
int main(void){
int total;
bool nai=false;
scanf("%d",&total);
getchar();
for(int i=0;i<total;i++){
int j=0;
char temp;
while(1){
scanf("%c",&temp);
if(temp=='\n'){
words[i][j]='\0';
break;
}
words[i][j++]=temp;
}
revers(words[i]);
}
for(int i=1;i<total;i++){
int lena=strlen(words[0]);
int lenb=strlen(words[i]);
int lenmin=lena<lenb?lena:lenb;
if(lenmin==0){//ans中字符都被删完了;
nai=true;
break;
}
for(int j=0;j<lenmin;j++){
if(words[0][j] != words[i][j]){
words[0][j]='\0';
break;
}
}
}
if(nai){
printf("nai");
}else{
revers(words[0]);
printf("%s",words[0]);
}
return 0;
}
思路:
找 N 个含空格字符串的公共后缀问题。首先,建一个字符串数组,将字符串都扫进来,放进去,再都翻转(方便比较后缀);然后直接用第一个字符串 ,也就是words[0] 跟后面的每个字符串比,字符相同啥都不做,不同直接让words[0] 这里放一个终止符’\0’,相当于把 words[0] 后面的都丢了不要了,最后words[0]里面剩下的部分就是公共后缀,翻转再输出即可。
这里过程中出了一个问题,因为每行之间都有空格,所以不能用 scanf("%s",&words[i]), 我扫的时候犯了一个错误,就是把换行符 ‘\n’也放在了字符串末尾,最后程序运行的时候,如果没有公共后缀就会输出一个换行符,如果有公共后缀就会输出后缀加一个换行符。所以需要注意,千万不要把’\n’也扫进去。