Cod sursa(job #931093)

Utilizator razvan.popaPopa Razvan razvan.popa Data 27 martie 2013 23:20:11
Problema PScPld Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.72 kb
#include<fstream>
#include<algorithm>
#define infile "pscpld.in"
#define outfile "pscpld.out"
#define nMax 2000005
using namespace std;

char S[nMax];

int Lg[nMax];

int N, Sol;


int main(){
	ifstream f(infile);
	ofstream g(outfile);

	while(f >> S[2 * N + 1])
		N ++;

	for(int idx = 1, i = 1; i < 2 * N; ++ i){
	    if(idx + Lg[idx] - 1 < i)
	    	Lg[i] = i & 1;
	    else
	    	Lg[i] = min(Lg[idx - (i - idx)], idx + Lg[idx] - i);

	    int j = Lg[i] + 1;
	    while(i - j >= 1 && i + j < 2 * N && S[i-j] == S[i+j]) j += 2;

	    Lg[i] = j - 1;
	    if(i + Lg[i] > idx + Lg[idx])
	    	idx = i;

	    Sol += (Lg[i] + 1) / 2;
	}

	g << Sol << '\n';

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

    return 0;
}