当前位置: 代码迷 >> 综合 >> 个人练习-PAT甲级-1077 Kuchiguse
  详细解决方案

个人练习-PAT甲级-1077 Kuchiguse

热度:36   发布时间:2023-12-21 11:15:41.0

题目链接https://pintia.cn/problem-sets/994805342720868352/problems/994805390896644096

大怪题,看了半天没看懂。。。以为是求出现频率最高的词,还用了map<string, int>,后来发现这个suffix要求是每个句子里都有的。没有公共的suffix就输出"nai"。suffix是指后缀,所以反过来判断比较方便。

读入数据,第一行直接先赋给ans,之后和每一行的倒过来比较,ans肯定是越来越短的,因为要求相同,那么末4位相同肯定比末3位严格,不容易满足。用substr()即可。

    int N;scanf("%d\n", &N);string ans;for (int i = 0; i < N; i++) {
    string str;getline(cin, str);reverse(str.begin(), str.end());if (i == 0) {
    ans = str;continue;}else {
    if (str.size() < ans.size()) {
    string tmp = ans;ans = str;str = tmp;}int min_len = ans.size();for (int j = 0; j < min_len; j++) {
    if (ans[j] != str[j]) {
    ans = ans.substr(0, j);break;}}}}

输出,记得倒回来。

    reverse(ans.begin(), ans.end());if (ans.size() == 0)printf("nai");elsecout << ans;

完整代码

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<string.h>using namespace std;int main() {
    int N;scanf("%d\n", &N);string ans;for (int i = 0; i < N; i++) {
    string str;getline(cin, str);reverse(str.begin(), str.end());if (i == 0) {
    ans = str;continue;}else {
    if (str.size() < ans.size()) {
    string tmp = ans;ans = str;str = tmp;}int min_len = ans.size();for (int j = 0; j < min_len; j++) {
    if (ans[j] != str[j]) {
    ans = ans.substr(0, j);break;}}}}reverse(ans.begin(), ans.end());if (ans.size() == 0)printf("nai");elsecout << ans;return 0;
}

感想:读懂题真不是件容易的事。。。