Cod sursa(job #1300845)

Utilizator maritimCristian Lambru maritim Data 25 decembrie 2014 00:01:06
Problema PScPld Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 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;
ll Sol;
char S[MaxN];
int mark[Max2N], 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++)
    {
        //cout << i << " " << Lung[(mark[i] << 1) - i] << "\n";
        int known = (mark[i] ? 0 : Lung[(mark[i] << 1) - i]);

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

        Lung[i] = known-1;

        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]);
        cout << "\n";
    for (int i=1;i<=length;i++)
        printf ("%2d ", mark[i]);
*/
    fprintf (g, "%d\n", Sol);
}