PAT甲级刷题之路——1077 Kuchiguse

本文详细解析了PAT甲级1077Kuchiguse题目,探讨了如何通过分析一系列日语对话来识别个人的惯用后缀,即“Kuchiguse”。文章分享了作者的解题思路,包括使用getline和vector进行数据处理,并通过对比找到解决方案。特别提到了处理特殊情况的重要性,如后缀长度与最短对话长度相等的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT甲级1077 Kuchiguse(20分)

原题如下

在这里插入图片描述
在这里插入图片描述

题目意思

日语中一个人说话的管用后缀可以反映一个人的性格,这个后缀被称为“ K u c h i g u s e Kuchiguse Kuchiguse”,输入同一个人说的话,找出“ K u c h i g u s e Kuchiguse Kuchiguse”,若无则输出" n a i nai nai“。
输入:
N N N:话的数量
N N N行话
输出:
K u c h i g u s e Kuchiguse Kuchiguse
若无,则输出
nai

自己的想法

  1. g e t l i n e ( c i n , s t r ) getline(cin,str) getline(cin,str)输入每一行的话,然后将 s t r str str压入vector中然后进行比对。
  2. 若有则输出,否则输出 n a i nai nai

答案反馈

第一次提交,错了最后一个3分的测试点。
在这里插入图片描述

  1. 经过看别的大佬的博客,发现最后一个测试点是特殊情况,即当后缀长度和最短话的长度相同时的情况。
  2. 还有一个是第一次直接把第一段话的长度最为参考长度,时间上应该把最短的话的长度设为参考长度。
    在这里插入图片描述

代码

感觉柳神的先翻转后处理的方法更不容易出错。
柳神A1077传送门

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cmath>
#include<vector>
#include<cstdlib>
#include<set>
#include<queue>
#include<map>
#include<stack>
using namespace std;
vector<string> hanashi;
int main() {
	int n;
	cin >> n;
	getchar();//因为之后要用getline,所以要把n后面输入的回车消掉
	for (int i = 0; i < n; i++) {
		string str;
		getline(cin, str);
		//cout <<str << endl;
		hanashi.push_back(str);
	}
	int num = hanashi.size();
	int min = 1000000, u = -1;
	for (int j = 0; j < num; j++) {
		if (hanashi[j].length() < min) {
			u = j; min = hanashi[j].length();
		}
	}
	string temp;
	int temp_size = hanashi[u].size();
	int flag = 0;
	int i;
	for (i = 0; i < temp_size; i++) {
		//if (hanashi[0][temp_size - i] == ' ')break;
		temp.insert(temp.begin(),hanashi[u][temp_size-1 - i]);
		//cout << "***" << endl;
		//cout << temp << ' ' << '*';
		for (int j = 0; j < num; j++) {
			int len = hanashi[j].size();
			string temp2 = hanashi[j].substr(len - 1-i, len);
			if (temp2 != temp) {
				flag = 1; break;
			}
			//cout << temp2 << endl;
		}
		if (flag)break;
	}
	if (i == 0)cout << "nai" << endl;
	else {
		int flag2 = 0;
		int j;
		//cout << flag << ' ' << i << endl;
		//没有考虑到特殊情况,就使j=1,而当后缀长度等于最短话的长度时则j应该等于0
		if (flag == 0 && i == temp_size) {j = 0; }
		else j = 1;
		for (; j <= i; j++) { 
			flag2 = 1;
			cout << temp[j];
		}
		cout << endl;
	}
	return 0;
}

结语

刚开始难免磕磕碰碰,每一份努力都不会被辜负!!加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值