Cod sursa(job #667663)

Utilizator balakraz94abcd efgh balakraz94 Data 23 ianuarie 2012 16:35:55
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.94 kb
#include<fstream>
#include<algorithm>
#define infile "pscpld.in"
#define outfile "pscpld.out"
#define n_max 2000005
using namespace std;

char S[n_max]; 

int Lung[n_max];

int N;

long long sol;


void citeste()
{
    ifstream fin(infile);
	
    while (fin >> S[2 * N + 1])
        N ++;
	
    fin.close();
}



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

        int j = Lung[i] + 1;
		
        while (i - j >= 1 && i + j < 2*N && S[i-j] == S[i+j])
            j+=2;
        j -= 2;
		
        Lung[i] = j + 1;
		
        if ( i + Lung[i] > idx + Lung[idx])
            idx = i;
	
        sol += (Lung[i] + 1) / 2;
    }
}



void afiseaza()
{
	ofstream fout(outfile);
	
	fout<<sol<<'\n';
	
	fout.close();
}


int main(void)
{
	citeste();
	rezolva();
	afiseaza();
	
    return 0;
}