更多PAT甲级题解--acking-you.github.io
题目
题目大意
题目大意很简单,就是给出很多句话,要你分析,最长的公共后缀。
- 这个地方难在输入的处理,注意输入如果用的
getline()
接收的一行,则前面一般不能有别的输入方式,否则会起冲突,导致getline()
并未抢到值。那么怎么解决呢?用scanf("%d\n")
限定输入的分隔符,这样就不会有冲突了!
代码解析
Input输入处理
void Input() { scanf("%d\n", &N); for (int i = 0; i < N; i++) { getline(cin, s[i]); //顺便求出最大的长度方便后续遍历, //实际上求出最小长度是最好,这样就不用再后续判断了。 MaxSize = max(MaxSize, (int)s[i].size()); } }
print输出处理
void print() { string res = "";//普通的迭代循环判断 for (int i = 1; i <= MaxSize; i++) { if (s[0].size() < i) break; bool f = true; string cmp = s[0].substr(s[0].size() - i, i); for (int j = 0; j < N; j++) { int len = s[j].size(); if (len < i) goto end; if (cmp != s[j].substr(len - i, i)) { f = false; break; } } if (f) res = cmp; } end: res = (res == "") ? "nai" : res; cout << res; }
整合代码得出答案
效率还挺好
#include<bits/stdc++.h> using namespace std; int N; int MaxSize; string s[101]; //@输入处理 void Input() { scanf("%d\n", &N); for (int i = 0; i < N; i++) { getline(cin, s[i]); MaxSize = max(MaxSize, (int)s[i].size()); } } //@输出处理 void print() { string res = ""; for (int i = 1; i <= MaxSize; i++) { if (s[0].size() < i) break; bool f = true; string cmp = s[0].substr(s[0].size() - i, i); for (int j = 0; j < N; j++) { int len = s[j].size(); if (len < i) goto end; if (cmp != s[j].substr(len - i, i)) { f = false; break; } } if (f) res = cmp; } end: res = (res == "") ? "nai" : res; cout << res; } int main() { Input(); print(); return 0; }