제출 #1284780

#제출 시각아이디문제언어결과실행 시간메모리
1284780WH8Palindromic Partitions (CEOI17_palindromic)C++20
100 / 100
166 ms11272 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double
const int q=131, m=1e9+7;

signed main(){
	int t;cin>>t;
	auto c=[&](char in)->int{
		int res=in-'a';
		//~ cout<<in<<" "<<res<<endl;
		return res;
	};
	vector<int> pre(1e6, 1);
	for(int i=1;i<1e6;i++){
		pre[i]=(pre[i-1]*q)%m;
	}
	while(t--){
		string s;
		cin>>s;
		int n=s.size(), sm=0, a=0, b=0, p=0;
		for(int i=0;i<n/2;i++){
			//~ printf("before %lld %lld\n", a, b);
			b=(b*q+c(s[n-i-1]))%m;			
			a=(a+c(s[i])*pre[i-p])%m;
			//~ printf("%lld : %lld %lld\n", i, a, b);

			if(a==b){
				bool ok=true;
				int s1=p,s2=n-i-1;
				for(int j=0;j<=i-p;j++){
					if(s[s1+j]!=s[s2+j]){
						ok=false;
						break;
					}
				}
				if(ok){
					p=i+1;
					sm+=2;
					a=0, b=0;
				}
			}
		}
		cout<<sm+(n%2==0 and a==0 and b==0? 0:1)<<'\n';
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...