Submission #1310998

#TimeUsernameProblemLanguageResultExecution timeMemory
1310998tarner_exePalindromic Partitions (CEOI17_palindromic)C++20
100 / 100
272 ms25576 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define elif else if
#define ft first
#define sc second
#define pII pair<int,int>
#define pb push_back

const int sizen = 2e6+11;
const int p = 31;
const int modd = 1e9+321;

int pt[sizen];
int hsh[sizen];

int t,N;

string st;

void pre_pr()
{
    pt[0]=1;
    for (int i = 1 ;i <= sizen-3; i++)
    {
        pt[i] = (pt[i-1]*p)%modd;
    }
}
void hshs()
{
    for (int i = 1 ; i <= st.size() ; i++)
    {
        hsh[i] = ((hsh[i-1]*p)%modd + ((st[i-1]-'a')+1))%modd;
    }
}

bool zgodnosc(int l_p , int l_k , int p_p , int p_k)
{
    if(l_k == 2)
    {
        //cout << l_p << ' ' << l_k << " " << p_p << " " << p_k << '\n';
        //cout << hsh[l_k] << " - " << hsh[l_p-1] << " * " << pt[l_k-l_p+1] << "\n";
        //cout << hsh[p_k] << " - " << hsh[p_p-1] << " * " << pt[p_k-p_p+1] << "\n"; 
    }
    int LEWY = (hsh[l_k] - ((hsh[l_p-1]*pt[l_k-l_p+1])%modd) + modd)%modd;
    int PRAWY =(hsh[p_k] - ((hsh[p_p-1]*pt[p_k-p_p+1])%modd) + modd)%modd;
    if(LEWY == PRAWY)
    {
        return true;
    }
    return false;
}

void solve()
{
    cin >> st;
    N = st.size();
    hshs();
    int last_l=1;
    
    int last_p = N;
    
    int w = 0;
    
    for (int i = 1 ; i <= st.size() ; i++)
    {
        if(zgodnosc(last_l, i, last_p-(i-last_l) , last_p))
        {
            //cout << i << '\n';
            if(i == last_p)
            {
                w ++;
                cout << w << '\n';
                return; 
            }
            elif(i < last_p)
            {
                w += 2;
            }
            last_p = last_p-(i-last_l+1);
            last_l = i+1;
        }
    }
    cout << w << "\n";
}
signed main()
{
    pre_pr();
    cin >> t;
    while(t--)
    {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...