代码:
#include <bits/stdc++.h>
#define binpow(P,q) cf[q]
using namespace std;
const unsigned long long P = 23;
unsigned long long cf[2000010];
int n;
string u;
unsigned long long U[2000010];
unsigned long long getHash (int l, int r) {
unsigned long long hash1tol = U[l - 1] * binpow(P, r - l + 1);
return U[r] - hash1tol;
}
string find1 () {
int mid = (n + 1) / 2;
string ans;
for (int i = n; i >= mid + 1; i--)
ans = u[i] + ans;
ans = ' ' + ans;
return ans;
}
string find2 () {
int mid = (n + 1) / 2;
string ans;
for (int i = mid - 1; i >= 1; i--)
ans = u[i] + ans;
ans = ' ' + ans;
return ans;
}
unsigned long long H[10005];
int calHash (string s) {
int str = s.size();
int ans = 0;
for (int i = 1; i <= str; i++)
ans += s[i] * binpow(P, i);
return ans;
}
void incf () {
cf[0] = 1;
for (int i = 1; i <= n; i++) cf[i] = cf[i - 1] * P;
}
int main () {
scanf("%d", &n);
incf();
cin >> u;
if (n % 2 == 0) {
puts("NOT POSSIBLE");
return 0;
}
u = ' ' + u;
for (int i = 1; i <= n; i++)
U[i] = U[i - 1] * P + u[i];
int mid = (n + 1) / 2; // 中间的位置
int cnt = 0; // 统计答案个数
string ans;
unsigned long long last;
// 前半段 wrong
for (int i = 1; i < mid; i++) // 枚举多余
if (U[i - 1] * binpow(P, mid - i) + getHash(i + 1, mid) == getHash(mid + 1, n)) {
string tmp = find1();
if (cnt == 0) {
cnt = 1;
ans = tmp;
last = calHash(tmp);
}
if (cnt == 1) {
int now = calHash(tmp);
if (now == last) continue;
else {
puts("NOT UNIQUE");
return 0;
}
}
}
// 正中间 right
if (U[mid - 1] == U[n] - U[mid] * binpow(P, n - mid)) {
string tmp = find1();
if (cnt == 0) {
cnt = 1;
ans = tmp;
last = calHash(tmp);
}
if (cnt == 1) {
int now = calHash(tmp);
if (now != last) {
puts("NOT UNIQUE");
return 0;
}
}
}
// 后半段 wrong
for (int i = mid + 1; i <= n; i++) // 枚举多余
if (U[mid - 1] == getHash(mid, i - 1) * binpow(P, n - i) + getHash(i + 1, n)) {
string tmp = find2();
if (cnt == 0) {
cnt = 1;
ans = tmp;
last = calHash(tmp);
}
if (cnt == 1) {
int now = calHash(tmp);
if (now == last) continue;
else {
puts("NOT UNIQUE");
return 0;
}
}
}
if (cnt == 0) puts("NOT POSSIBLE");
else {
int nmsl = ans.size();
for (int i = 1; i <= nmsl; i++) printf("%c", ans[i]);
}
return 0;
}
Sub 1 #50 和 Sub2 除了 #60 和 #65 都 TLE 了,求优化(代码本身逻辑应该没问题,教练这么写能过)