Cod sursa(job #904803)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 4 martie 2013 21:04:31
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>
#include <cassert>
#include <utility>

using namespace std;

#define MAXN 1000005
char s[MAXN];
char T[2 * MAXN];
int P[2 * MAXN];

int main() {
	freopen("pscpld.in", "r", stdin);
	freopen("pscpld.out","w", stdout);

    fgets(s, sizeof(s), stdin);

    int N = 0;
    for(int i = 0; s[i] != '\0' && s[i] != '\n'; i++) {
        N++;
        T[2 * i] = s[i];
        T[2 * i + 1] = '#';
    }

    long long ans = 0;
    int R = 0;
    int C = 0;
    for(int i = 0; i < 2 * N; i++) {
        int pi = C - (i - C);

        if(R <= i)
            P[i] = 1;
        else
            P[i] = min(R - i + 1, P[pi]);

        while(i - P[i] >= 0 && i + P[i] < 2 * N && T[i - P[i]] == T[i + P[i]])
            P[i]++;

        if(i + P[i] - 1 > R) {
            C = i;
            R = i + P[i] - 1;
        }

        if((i & 1) == 0)
            ans += (P[i] + 1) / 2;
        else
            ans += P[i] / 2;
    }

    printf("%lld\n", ans);

	return 0;
}