1. 程式人生 > >Codeforces Round #527 (Div. 3) C. Prefixes and Suffixes(思維)

Codeforces Round #527 (Div. 3) C. Prefixes and Suffixes(思維)

題目連結: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("");
}