Cod sursa(job #2064084)

Utilizator Coroian_DavidCoroian David Coroian_David Data 11 noiembrie 2017 19:32:57
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <bits/stdc++.h>

#define MAX_N 1000000

using namespace std;

typedef long long lint;

string a;
string s;

int pal[MAX_N * 2 + 1];

int n;

void readFile()
{
    ifstream f("pscpld.in");

    f >> a;

    n = a.size();

    f.close();
}

void getPal()
{
    int c = 0;
    int r = 0;
    pal[0] = 1;
    int i;
    for(i = 1; i < 2 * n - 1; i ++)
    {
        int ogl = c - (i - c);

        if(ogl < 0)
            ogl = 0;

        else
            ogl = pal[ogl];

        pal[i] = min(max(0, r - i + 1), ogl);

        while((i - pal[i] >= 0 && i + pal[i] < 2 * n - 1) && s[i - pal[i]] == s[i + pal[i]])
            pal[i] ++;

        if(i + pal[i] - 1 > r)
        {
            r = i + pal[i] - 1;
            c = i;
        }
    }
}

lint rez;

void getRez()
{
    int i;
    for(i = 0; i < 2 * n - 1; i ++)
    {
        rez += ((pal[i] - (i & 1) + 1) >> 1);
      //  cout << pal[i] << " ";
    }
   //**/ cout << "\n";
}

void getSir()
{
    s.resize(2 * n - 1);

    int i;
    for(i = 0; i < n; i ++)
    {
        s[i << 1] = a[i];

        if(i < n)
            s[(i << 1) + 1] = '|';
    }/*

    for(i = 0; i < 2 * n - 1; i ++)
        cout << s[i] << " ";
    cout << "\n";*/
}

void solve()
{
    getSir();

    getPal();

    getRez();
}

void printFile()
{
    ofstream g("pscpld.out");

    g << rez << "\n";

    g.close();
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}