【题解】[BalticOI 2014]friends

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3916 (BZOJ3916)

  • 由题意可知 (N) 得为奇数,(S) 才存在,所以先特判 (N) 为偶数的情况。

  • 由题意可知 (S) 的长度为 (lfloor dfrac {N}{2} floor), 设 (S) 的长度为 (M)

  • 如果存在 (S),则 (S) 一定是 (U) 的前 (M) 个字符或后 (M) 个字符。

  • 用 substr 函数分别截取前 (M) 个字符和后 (M) 个字符,再依次匹配检查是否合法。

代码:

#include <bits/stdc++.h>
using namespace std;
int n, m, a1, a2;
string u, s1, s2;

int main()
{
	scanf("%d", &n);
ㅤㅤㅤㅤ if (n % 2 == 0)
	{
		printf("NOT POSSIBLE
");
		return 0;
	}
	cin >> u;
	m = n / 2;
	s1 = u.substr(0, m);
	int j = 0;
ㅤㅤㅤㅤ for (int i = m; i < n && j < m; i++)
		if (u[i] == s1[j]) j++;
ㅤㅤㅤㅤ if (j == m) a1 = 1;
	s2 = u.substr(n - m, m);
	j = 0;
	for (int i = 0; i < n - m && j < m; i++)
		if (u[i] == s2[j]) j++;
ㅤㅤㅤㅤ if (j == m) a2 = 1;
	if (!a1 && !a2) printf("NOT POSSIBLE
");
	else if (a1 && a2 && s1 != s2) printf("NOT UNIQUE
");
	else if (a1) cout << s1 << endl;
ㅤㅤㅤㅤ else cout << s2 << endl;
	return 0;
}
原文地址:https://www.cnblogs.com/LongDouble/p/13057454.html