【PAT 甲级】1077 Kuchiguse (20 分)

1077 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

我的思路

整体思想是反转字符串,循环找最小重复单元,用C++的String:

1.string的整行输入:参考getline用法,注意读N的时候如果不加"\n",getline无法正常使用;

2.string的倒序:使用反向迭代器实现;

3.string的初始化以及其他常用方法

 

我的代码

#include <iostream>
#include <string>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	int N;
	string a,b;
	
	//输入 
	scanf("%d\n", &N);  //注意!这里一定要\n换行,要不然getline无法正常使用。 
	getline(cin,a);
	
	string m(a.rbegin(), a.rend());  //使用反向迭代器实现倒序
	a = m;

	for (int g=1; g<=N-1; g++)
	{
		getline(cin,b);
		string n(b.rbegin(), b.rend());
		int i=0;
		int minL = min(a.length(), b.length());
		while(i<=minL)
		{  //找出重复字符串的倒序
			if (a[i]!=n[i]) break;
			i++;
		} 	
		if (i==0) 
		{  //若无重复字符串,则直接输出结束 
			printf("nai");  
			return 0; 
		} else {
			string t(a,0,i);  //从a中下标为0的字符开始,连续取i-1个字符构成t
			a = t;  //a是重复字符串的倒序
		}
	}

	//输出
	string rc(a.rbegin(),a.rend());  //重复字符串 
	cout << rc;

	return 0;
 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值