题目链接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;
}
感想:读懂题真不是件容易的事。。。