Cod sursa(job #1150778)

Utilizator Mihai22eMihai Ionut Enache Mihai22e Data 23 martie 2014 15:20:41
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
#include <fstream>

#include <cstring>
using namespace std;

const int MAX_N = 1000002;

int N;
int dp[2 * MAX_N];
long long sol;
char s[2 * MAX_N], temp[MAX_N];

int main() {
    ifstream f("pscpld.in");
    ofstream g("pscpld.out");

    s[0] = temp[0] = ' ';
    f >> (temp + 1);

    N = strlen(temp) - 1;
    for(int i = 1, j = 1; i <= N; ++i) {
        s[j] = '#';
        s[++j] = temp[i];
        ++j;
    }

    N = 2 * N + 1;
    s[N] = '#';
    for(int i = 1, best = 0; i <= N; ++i) {
        if(i + best >= dp[i]) 
            dp[i] = min(dp[i - 2 * (i - best)], best + dp[best] - i);
        dp[i] = max(dp[i], 1);
        while(i - dp[i] >= 1 && i + dp[i] <= N && s[i - dp[i]] == s[i + dp[i]])
            ++dp[i];
        --dp[i];

        if(i + dp[i] >= best + dp[best])
            best = i;
        sol += (dp[i] + 1) / 2;
    }

    g << sol << "\n";

    f.close();
    g.close();

    return 0;
}