Cod sursa(job #1300848)

Utilizator maritimCristian Lambru maritim Data 25 decembrie 2014 00:13:05
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include<iostream>
#include<cstdio>
using namespace std;

FILE *f = fopen("pscpld.in", "r");
FILE *g = fopen("pscpld.out", "w");

#define MaxN 1000100
#define Max2N (2 * MaxN)
#define ll long long

int length, dr, pivot;
ll Sol;
char S[MaxN];
int Lung[Max2N], newS[Max2N];

int main()
{
    fgets (S, sizeof(S), f);

    for (length=1;S[length];length++)
        newS[length<<1] = S[length-1],
        newS[(length<<1)-1] = '_';

    length <<= 1;
    length -- ;
    newS[length] = '_';

    for (int i=1;i<length;i++)
    {
        int known = (dr >= i ? 1 : Lung[(pivot << 1) - i]);

        for (;newS[i - known] == newS[i + known] && 
                i + known <= length && i - known > 0;known ++) ;

        Lung[i] = known-1;

        if (i + known - 1 >= dr)
            dr = i + known - 1,
            pivot = i;

        Sol += ((Lung[i] + (Lung[i]&1)) >> 1);
    }

/*    for (int i=1;i<=length;i++)
        printf ("%2d ", i);
        cout << "\n";
    for (int i=1;i<=length;i++)
        printf (" %c ", newS[i]);
        cout << "\n";
    for (int i=1;i<=length;i++)
        printf ("%2d ", Lung[i]);
*/

    fprintf (g, "%d\n", Sol);
}