Cod sursa(job #509951)

Utilizator mgltIacob Mihaita mglt Data 12 decembrie 2010 02:40:10
Problema PScPld Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#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;
}