Pagini recente » Cod sursa (job #2832181) | Cod sursa (job #1315890) | Cod sursa (job #1228846) | Cod sursa (job #746129) | Cod sursa (job #1576680)
#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;
}