Submission #1254368

#TimeUsernameProblemLanguageResultExecution timeMemory
1254368mngoc._.Palindromic Partitions (CEOI17_palindromic)C++20
0 / 100
0 ms320 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e5 + 5;
const int base = 311;
const int LOG = 32;
const int MOD = 1e9 + 7;
int hsh[N];
int hsh2[N];
int power[N];
int mngoc[N][LOG];
int nxt[N];
int n , m;
string s;
string t; 
int get(int l , int r){
	return (hsh[r] - hsh[l - 1] * power[r - l + 1]%MOD + MOD) % MOD;
}

void solve(void){
	cin >> s; n = s.size();
	t = s;
	reverse(t.begin() , t.end());
	s = '#' + s;
	t = '#' + t;	
	power[0] = 1;
	hsh[0] = 0 ; hsh2[0] = 0;
	for(int i = 1 ; i <= n ; i++){
		hsh[i] = (hsh[i - 1] * base + (s[i] - 'a' + 1)) % MOD;
		power[i] = (power[i - 1] * base) % MOD;
	}
	
	for(int i = 1 ; i <= n ; i++){
		int ans = n;
	    int k = n - i + 1;
	    for(int j = 0 ; j <= n - 2 * (i - 1) ; j++){
	    	if(get(i , i + j) == get(k - j , k)){
	    		ans = j;
	    		break;
			}
		}
	    nxt[i] = i + ans;
	}
	int l = 0 , r = n;
	int cnt = 0;
	for(int i = 1 ; i <= n ; i++){
		l = nxt[i];
	    r = n - nxt[i] + 1;
	    if(l < r) cnt += 2;
	    else cnt++;
		if(l >= r) break;
	   
	}
	cout << cnt << endl;
	
	
	
}

signed main(void){
	ios_base :: sync_with_stdio(false);
	cin.tie(NULL);
	int testCase; cin >> testCase;
	while(testCase--){
		solve();
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...