【题解】[BalticOI 2014]friends

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

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

  • 由题意可知 \(S\) 的长度为 \(\lfloor \dfrac {N}{2}\rfloor\), 设 \(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\n");
		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\n");
	else if (a1 && a2 && s1 != s2) printf("NOT UNIQUE\n");
	else if (a1) cout << s1 << endl;
ㅤㅤㅤㅤ else cout << s2 << endl;
	return 0;
}

posted on 2020-06-06 22:43  LongDouble  阅读(319)  评论(2编辑  收藏  举报