Codeforces Round #527 (Div. 3) C. Prefixes and Suffixes(思維)
阿新 • • 發佈:2018-12-24
題目連結:http://codeforces.com/contest/1092/problem/C
題意:有一個長度為n的字串(並沒有給出),然後給出了2*n-2個這個字串的字首和字尾子串,也就是長度為1的有兩個,分別是字串的字首和字尾,長度為2的也有兩個,也是一個為字首一個為字尾,直到n-1的長度的前後綴子串,然後讓判斷當前子串是字首還是字尾(字首輸出P字尾輸出S),要注意的是abcd的長度為3的字尾是bcd而不是dcb。
思路:我們先找到第一個長度為 n - 1的字串當做字首基準,第二個為字尾基準,當然現在的字首字尾不一定是真正的字首和字尾,所以我們還要判斷一下,根據字首的性質,和字首首字母相等的子串個數一定是大於等於n - 1個的,還有就是如果這個子串是字首那麼 pre.substr(1) == suf.substr(0, n-2) (pre是基準字首,suf是基準字尾)只有滿足上述兩個條件才是基準字首。
比如abcde,以bcde為基準字首的話上述兩種性質都不滿足,比如aaadc,如果以aadc為基準字首,滿足第一個性質不滿足第二個。確定基準字首後就很簡單了,然後以基準字首判斷其他的給定的子串是字首還是字尾就可以了。
#include <bits/stdc++.h> using namespace std; #define read(x) scanf("%d",&x) string s[1000]; int tam[1000]; int main() { int n; read(n); int m = n * 2 - 2; bool b = false; string suf, pre; for(int i = 0; i < m; i++) { cin >> s[i]; if (!b && s[i].size() == n-1) { pre = s[i]; b = true; } if (b && s[i].size() == n-1) suf = s[i]; } int cnt = 0; for(int i = 0; i < m; i++) if(s[i][0] == pre[0]) cnt++; if(pre.substr(1) != suf.substr(0, n-2) || cnt < m/2) swap(suf, pre); for(int i = 0; i < m; i++) { if (s[i] == pre.substr(0, s[i].size()) && !tam[s[i].size()]) { printf("P"); tam[s[i].size()] = 1; } else printf("S"); } puts(""); }