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
自己的想法
- 用 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中然后进行比对。
- 若有则输出,否则输出 n a i nai nai。
答案反馈
第一次提交,错了最后一个3分的测试点。
- 经过看别的大佬的博客,发现最后一个测试点是特殊情况,即当后缀长度和最短话的长度相同时的情况。
- 还有一个是第一次直接把第一段话的长度最为参考长度,时间上应该把最短的话的长度设为参考长度。
代码
感觉柳神的先翻转后处理的方法更不容易出错。
柳神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;
}
结语
刚开始难免磕磕碰碰,每一份努力都不会被辜负!!加油!!