题目链接:点这里
题意:这题意我读错了三个小时...最后到网上找题解的时候才发现读错了QAQ暴击
题意是判断给你的2*n-2个字符串是前缀还是后缀,不是判断这个字符串的内容...我真的欲哭无泪,理解能力太菜了
思路:将两个n-1长的字符串取出,先判断第一个取出的字符串和给出的字符串前缀的匹配程度。如果匹配程度大于半数,则这个为所需字符串-1,否则就是另外一个。同时要注意回文串的情况,所以开了一个cnt数组进行标记,其中p和s的数量要刚好等于n-1
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<fstream> #include<iomanip> #include<string> #include<set> #include<memory.h> #include<algorithm> using namespace std; string s[200]; int cnt[200]; int main() { int n; string st1 = "", st2 = "", d; cin >> n; memset(cnt, 0, sizeof(cnt)); for (int i = 1; i <= 2 * n - 2; i++) { cin >> s[i]; if (s[i].size() == n - 1) { if (st1.size() == 0) st1 = s[i]; else st2 = s[i]; } } int co = 0; for (int i = 1; i <= 2 * n - 2; i++) { if (st1.substr(0, s[i].size()) == s[i]) co++; } if (co >= n - 1 && st1.substr(1, n - 1) == st2.substr(0, n - 2)) d = st1; else d = st2; for (int i = 1; i <= 2 * n - 2; i++) { if (s[i] == d.substr(0, s[i].size()) && cnt[s[i].size()] != 1) { cnt[s[i].size()] = 1; cout << "P"; } else cout << "S"; } }