题目链接: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;
}