Cod sursa(job #807914)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 5 noiembrie 2012 21:51:42
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.82 kb
#include <fstream>
#include <cstring>

#define MAX 2000005

using namespace std;

char aux[MAX], sir[MAX];
int dp[MAX], n, L, R, C, lgt;
long long rez = 1;

int main()
{
    ifstream in("pscpld.in"); in>>aux; in.close();
    lgt = strlen(aux);
    for(int i = 0; i < lgt; i++)
    {
        sir[++n] = aux[i];
        if(i != lgt - 1) sir[++n] = '#';
    }
    dp[1] = 1; C = L = R = 1;
    for(int i = 2; i <= n; i++)
    {
        dp[i] = max(min(dp[2 * C - i], C + dp[C] - i), 1);
        L = i - dp[i];
        R = i + dp[i];
        while(L && R <= n && sir[L] == sir[R])
            L--, R++, dp[i]++;
        if(sir[i] == '#') rez += dp[i] / 2;
        else rez += (dp[i] + 1) / 2;
        if(i + dp[i] > C + dp[C]) C = i;
    }
    ofstream out("pscpld.out"); out<<rez; out.close();
    return 0;
}