Cod sursa(job #3291964)

Utilizator andiRTanasescu Andrei-Rares andiR Data 6 aprilie 2025 14:25:38
Problema PScPld Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.92 kb
// Author: Tanasescu Andrei-Rares
/*
     █████╗  ██████╗ ████████╗
    ██╔══██╗ ██╔══██╗╚══██╔══╝
    ███████║ ██████╔╝   ██║   
    ██╔══██║ ██╔══██╗   ██║   
    ██║  ██║ ██║  ██║   ██║   
    ╚═╝  ╚═╝ ╚═╝  ╚═╝   ╚═╝   
*/
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <stack>
#include <deque>
#include <iomanip>
#include <vector>
#include <cassert>

#pragma GCC optimize("O3")

#define fi first
#define se second
#define pb push_back
#define pf push_front

using namespace std;

ifstream fin ("pscpld.in");
ofstream fout ("pscpld.out");

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const ll Nmax=2e6+5, inf=1e9+5;

int n;
string init;
char s[Nmax];
int man[Nmax];

inline int expand(int pos, int len){
    while (s[pos-len]==s[pos+len])
        len++;
    
    return len;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    fin>>init;
    
    s[n++]+='!';
    for (auto it:init){
        s[n++]='#';
        s[n++]=it;
    }
    s[n++]='#';
    s[n++]='?';

    int l=0, r=0;
    for (int i=1; i<n; i++){
        if (i>r){
            man[i]=expand(i, 0);
            l=i-man[i]+1;
            r=i+man[i]-1;
        }
        else{
            int j=l+r-i;

            man[i]=min(man[j], r-i+1);
            if (man[i]==r-i+1){
                man[i]=expand(i, man[i]);

                if (i+man[i]-1>r){
                    l=i-man[i]+1;
                    r=i+man[i]-1;
                }
            }
        }
    }

    ll sol=0;
    for (int i=1; i<n; i++)
        sol+=man[i]/2;
    
    fout<<sol;

    return 0;
}