Cod sursa(job #1227441)

Utilizator o_micBianca Costin o_mic Data 10 septembrie 2014 16:20:02
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <algorithm>
#define MAX_LENGTH 2000001

using namespace std;

char s[MAX_LENGTH], T[MAX_LENGTH];
int p[MAX_LENGTH];

int main()
{
    int n, mid, r, aux;
    long long sum = 0;
    fstream f("pscpld.in", ios::in);
    fstream g("pscpld.out", ios::out);
    f >> s;
    T[0] = '^';
    n = strlen(s);
    for(int i = 0 ; i < n ; i++)
    {
        T[2*i + 1] = ' ';
        T[2*i + 2] = s[i];
    }
    T[2*n + 1] = ' ';
    T[2*n + 2] = '$';
    n = strlen(T);
    mid = r = 0;
    for(int i = 1 ; i < n-1 ; i++)
    {
        aux = mid - (i - mid);
        if(r > i)
            p[i] = min(r - i, p[aux]);
        else
            p[i] = 0;
        while(T[i + 1 + p[i]] == T[i - 1 - p[i]])
            p[i]++;
        if(i + p[i] > r)
        {
            r = i + p[i];
            mid = i;
        }
        sum += (p[i] + 1) / 2;
    }
    g << sum;
    return 0;
}