求助 TLE
查看原帖
求助 TLE
114914
一只书虫仔楼主2021/7/15 15:55

代码:

#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 了,求优化(代码本身逻辑应该没问题,教练这么写能过)

2021/7/15 15:55
加载中...