Submission #138289

#TimeUsernameProblemLanguageResultExecution timeMemory
138289AtalasionPalinilap (COI16_palinilap)C++14
100 / 100
422 ms21684 KiB
#include <bits/stdc++.h>

#define F first
#define S second
#define pb push_back

using namespace std;

typedef long long ll;
typedef string str;
typedef pair<ll, ll> pll;

// lines are numbered from 0 to n

const ll N = 1e5 + 10;
const ll H = 727;
const ll MOD = 1e9 + 7;

str s;
ll tav_H[N], pr[N], pl[N], sum_lr[N], sum_rl[N], ans_lr[N], ans_rl[N], p_r[N], p_l[N], p_r2[N], p_l2[N];
ll n;

bool isval(int L, int R, int x){
	int LL = L - x;
	int RR = R + x;
	if (LL < 0 || RR > n) return 0;
	//cout << LL << ' ' << L << ' ' << R << ' ' << RR << '\n';
	ll RH = pr[L] - (pr[LL] * tav_H[L - LL]) % MOD;
	ll LH = pl[R] - (pl[RR] * tav_H[L - LL]) % MOD;
	RH %= MOD;
	RH += MOD;
	RH %= MOD;
	LH %= MOD;
	LH += MOD;
	LH %= MOD;
	return (RH == LH);
}

int BS(int L, int R){
	//if (s[L] != s[R + 1]) return 0;
	int l = 0, r = L + 2;
	while (r - l > 1){
		int mid = (l + r) >> 1;
		if (isval(L, R, mid)) l = mid;
		else r = mid;
	}
	return l;
}

vector<pll> L_P[N], R_P[N];
int main(){
	cin >> s;
	tav_H[0] = 1;
	n = s.size();
	for (int i = 1; i < N; i++) tav_H[i] = tav_H[i - 1] * H % MOD;
	for (int i = 1; i <= n; i++){
		pr[i] = pr[i - 1] * H + s[i - 1] + 3;
		pr[i] %= MOD;
	}
	ll ans = 0;
	for (int i = n - 1; i >= 0; i--){
		pl[i] = pl[i + 1] * H + s[i] + 3;
		pl[i] %= MOD;
	}
	for (int i = 0; i <= n; i++){
		if (i != n){
		//	cout << i << ' ' << i + 1 << ' ';
			int x = BS(i, i + 1);
		//	cout << x << '\n';
			ans += BS(i, i + 1) + 1;
			L_P[i - BS(i, i + 1)].pb({i, i + 1});
			R_P[i + 1 + BS(i, i + 1)].pb({i, i + 1});
			//cout << i << ' ' << i + 1 << ' ' << i - x << ' ' << i << '\n';
			p_r[i - x] --;
			p_r[i] ++;
			p_r2[i] += x;
			p_l[i] ++;
			p_l2[i] += x;
			p_l[i + x] --;
		}
		if (i != 0){
			int x = BS(i, i);
			ans += BS(i, i);
			L_P[i - BS(i, i)].pb({i, i});
			R_P[i + BS(i, i)].pb({i, i});
		//	cout << i << ' ' << i << ' ' << i - x << ' ' << i << '\n';
			p_r[i - x] --;
			p_r2[i] += x;
			p_r[i] ++;
			p_l[i - 1] ++;
			p_l2[i - 1] += x;
			p_l[i + x - 1] --; 
		}		
	}
	ll res = ans;
//	cout << BS(0, 3) << ' ' << BS(1, 3) << '\n';
	//cout << ans << '\n';

	//for (int i = 0; i < n; i++) cout << p_r[i] << '\n';


	for (int i = 1; i <= n; i++) p_r[i] += p_r[i - 1];
	//cout << '\n';
	p_r[0] += p_r2[0];
	for (int i = 1; i <= n; i++) p_r[i] += p_r[i - 1] + p_r2[i];
	//cout << '\n';
	
	for (int i = n; i >= 0; i--) p_l[i] += p_l[i + 1];
	p_l[n] += p_l2[n];
	for (int i = n; i >= 0; i--) p_l[i] += p_l[i + 1] + p_l2[i];
	
//	for (int i = 0; i < n; i++) cout << p_r[i] << ' ';
	//cout << '\n';
	//cout << ans << ' ';
	for (int i = 0; i < s.size(); i++){
		for (int j = 0; j < 26; j++){
			ll ans2 = ans;
			if (j + 'a' == s[i]) continue;
			for (auto u:R_P[i]){
				ll l = u.F - (i - u.S); // khat chap
				if (l == 0) continue;
			//	cout << i << ' ' << u.F << ' ' << u.S << ' ' << l << '\n';
				if (s[l - 1] == j + 'a'){
					ans += BS(l - 1, i + 1);
					ans ++;
				}
			}
			for (auto u:L_P[i + 1]){
				ll r = u.S + u.F - (i + 1);
				if (r == n) continue;
				if (j + 'a' == s[r]){
					ans += BS(i, r + 1);
					ans ++;
				}
			}
			//res = max(res, ans);
			//if (j == 2 && i == 1) cout << ans << '\n';
			ans += p_l[i] + p_r[i];
			res = max(res, ans);
			//if (ans == 10) cout << i << ' ' << j << '\n';
			ans = ans2;
		}
	}
	cout << res;
	

	return 0;
}

Compilation message (stderr)

palinilap.cpp: In function 'int main()':
palinilap.cpp:115:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < s.size(); i++){
                  ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...