제출 #1165330

#제출 시각아이디문제언어결과실행 시간메모리
1165330subham_krrPalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
205 ms24204 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

int M = (1e9+7);
int B = 31;
vector<int> power(1, 1);

void precompute_powers(int n) {
    while (power.size() <= n) {
        power.push_back((power.back() * B) % M);
    }
}

vector<int> compute_hash(string s) {
    int n = s.size();
    vector<int> p_hash(n + 1, 0);
    for (int i = 0; i < n; i++) {
        p_hash[i + 1] = ((p_hash[i] * B) % M + s[i]) % M;
    }
    return p_hash;
}

int get_hash(vector<int>& p_hash, int start, int end) {
    int raw_val = (p_hash[end + 1] - (p_hash[start] * power[end - start + 1]) % M);
    return (raw_val % M + M) % M;
}

signed main() {
	int t;
	cin>>t;
	while(t--)
	{
		string s;
		cin>>s;
		int n=s.size();
		precompute_powers(n);
		vector<int>f_hash,b_hash;
		f_hash.push_back(0);
		b_hash.push_back(0);
		int chk=0,ans=0,cut=0;
		for(int i=0;i<n;i++)
		{
			if(i>n-i-1)
			{break;
			}
			f_hash.push_back(((f_hash.back()*B)%M+s[i])%M);
			b_hash.push_back((b_hash.back()+(s[n-i-1]*power[(int)b_hash.size()-1])%M)%M);
			if(f_hash.back()==b_hash.back())
			{ans++;
			chk=1;
			if(i==n-1-i)
			{cut++;
			}
			while((int)b_hash.size()>1)
			{b_hash.pop_back();
			f_hash.pop_back();
			}
			}
			else{chk=0;
			}
		}
		int res=0;
//		cout<<chk<<endl;
if(chk==0)
{res=1;
}
		cout<<2*ans+res-cut<<endl;
		
		
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...