Pagini recente » Cod sursa (job #1514686) | Cod sursa (job #2861683) | Cod sursa (job #2046358) | Cod sursa (job #822872) | Cod sursa (job #509951)
Cod sursa(job #509951)
#include <fstream>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[1000010];
long long *R;
long long PP(char *x,int n)
{
int j=0,ct=1;
int i=1;
long long s1=0;
while(i<=n-2)
{
while(x[i-j]==x[i+j+1])
j++;
R[ct]=j; ct++; s1+=j;
int k=1;
while (R[i-k] != R[i] - k && k <= j)
{
s1+=(min(R[i-k],R[i]-k)); R[ct]=(min(R[i-k],R[i]-k));
ct++; k++;
}
j=max(j-k,0); i+=k;
}
return s1;
}
long long PG(char *x,int n)
{
int j=0,ct=1;
unsigned int i=1;
long long s2=0;
while(i<=n-2)
{
while(x[i-j-1]==x[i+j+1])
j++;
R[ct]=j; ct++; s2+=j;
int k=1;
while(R[i-k]!=R[i]-k && k<=j)
{
s2+=(min(R[i-k],R[i]-k)); R[ct]=(min(R[i-k],R[i]-k));
k++; ct++;
}
j=max(j-k,0); i+=k;
}
return s2+n-2;
}
int main(){
s[0]='$';
f>>(s+1);
s[strlen(s+1)+1]='#';
int n=strlen(s);
R=new long long[n+3];
memset(R,0,sizeof(R)*sizeof(long long));
long long M=PP(s,n);
memset(R,0,sizeof(R)*sizeof(long long));
long long L=PG(s,n);
delete R;
g<<L+M;
}