Cod sursa(job #719700)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 21 martie 2012 23:06:26
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <fstream>
#include <cstdio>
#include <cstring>
#define NMAx 1000100
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;

char S[NMAx];
int N,DP[2][NMAx];
long long Sol;

int Expand(int Left,int Right) {
	
	int L;
	for(L=0;1<=Left&&Right<=N&&S[Left]==S[Right];L++,Left--,Right++);
	
	return L;
	
}
void solve(int K) {
	
	int i,R=0,P;
	
	for(i=1;i<=N;i++) {
		
		if(K==1&&S[i]!=S[i+1])
			continue;
		
		if(R>=i+K)
			DP[K][i]=min(DP[K][P-(i-P)],R-i-K);
		
		DP[K][i]+=Expand(i-DP[K][i],i+K+DP[K][i]);
		Sol+=DP[K][i];
		
		if(DP[K][i]+i+K>R) {
			P=i;
			R=DP[K][i]+i+K;
			}
		}
	
}
void citire() {
	
	ifstream in("pscpld.in");
	
	in.getline(S+1,NMAx);
	N=strlen(S+1);
	
	in.close();
	
}
void afis() {
	
	ofstream out("pscpld.out");
	out<<Sol<<'\n';
	out.close();
	
}
int main() {
	
	citire();
	
	solve(0);
	solve(1);
	
	afis();
	
	return 0;
	
}