Pagini recente » Cod sursa (job #2133205) | Cod sursa (job #2797326) | Cod sursa (job #2839402) | Cod sursa (job #2294109) | Cod sursa (job #719700)
Cod sursa(job #719700)
#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;
}