Cod sursa(job #1576680)

Utilizator redcrocodileIlies Andreea redcrocodile Data 22 ianuarie 2016 18:44:13
Problema PScPld Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char x;
string s;
int dreapta,indice,d[2000003],i,n;
void citire()
{
    while(f>>x)
    {
        s+=x;
        s+="1";
    }
    n=s.length()-1;
}
void pali()
{
    int j;
    if (dreapta+indice>i)
    {
        d[i]=min(d[2*indice-i],dreapta+indice-i);
        j=1;
        while(j+i+d[i]<n and i-d[i]-j>=0)
        {
          if(s[j+i+d[i]]==s[i-d[i]-j]) {j++; d[i]++;}
          else break;
        }
        if(d[i]+i>dreapta+indice) {indice=i; dreapta=d[i];}
    }
    else
    {
        j=1;
        while(j+i<n and i-j>=0)
        {
          if(s[j+i]==s[i-j]) {j++; d[i]++;}
          else break;
        }
        indice=i; dreapta=d[i];
    }
}
int main()
{
    int numar;
    citire();
    numar=(n+1)/2; //g<<numar<<endl;
    d[0]=0; indice=0; dreapta=0; //g<<d[0]<<" ";
    for(i=1;i<n;i++)
     {pali(); numar+=(d[i]+i%2)/2; /*g<<d[i]<<" ";*/}
    g<<numar;
    return 0;
}