Cod sursa(job #813219)

Utilizator klamathixMihai Calancea klamathix Data 15 noiembrie 2012 01:10:21
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
#include<iostream>
#include<fstream>
#include<string>
using std::string;
using std::cin;
using std::cout;
using std::min;
using std::ifstream;
using std::ofstream;
const int maxn = 2 * 1000 * 1000 + 5;

int i, j, n, centerBound, rightBound, left, right, Ans[2 * maxn + 5];
long long final_ans;
string Sir;

int main() {
    #ifdef INFOARENA
    ifstream cin("pscpld.in");
    ofstream cout("pscpld.out");
    #endif
    
    cin >> Sir;
    int n = Sir.size();
    string NewSir(2 * n + 1,' ');

    for(i = 0; i < n; ++i) {
        NewSir[2 * i] = Sir[i];
        NewSir[2 * i + 1] = '*';
    }
    
    for(i = 0; i <= 2 * n - 1; ++i) {
        
        if(i <= rightBound) {
            j = centerBound - (i - centerBound);
            Ans[i] = min(Ans[j], rightBound - i + 1);
            left = i - Ans[i];
            right = i + Ans[i];
        }
        else {
            left = i;
            right = i;
        }

        for(; left >= 0 && right <= 2 * n - 1 && NewSir[left] == NewSir[right]; left--, right++)
            Ans[i]++;

        --right;
        ++left;

        if(right > rightBound) {
            rightBound = right;
            centerBound = i;
        }
        
        //cout << Ans[i] << " ";

        if(i & 1) 
            final_ans += Ans[i] / 2;
        else
            final_ans += Ans[i] / 2 + Ans[i] % 2;
    }
    
    cout << final_ans << "\n";

    return 0;
}