Pagini recente » Cod sursa (job #2101359) | Cod sursa (job #2740400) | Cod sursa (job #2469135) | Cod sursa (job #1161269) | Cod sursa (job #960991)
Cod sursa(job #960991)
/*
Problema de a afla nr de palindroame/cel mai mare palindrom in O(N)
Retinem palindromul cel mai din dreapta;Daca pozitia curenta i face parte
din acel palindrom,atunci ducem simetricul fata de centru si:daca lungimea maxima
a simetricului nu depaseste palindromul maximal atunci e clar ca vor fi egale ca distanta
daca da,atunci stim ca si i e palindrom pana la pozitia dr(unde se termina palindromul
maximal).Deci il extindem cat de mult putem,si pozitia din dreapta o actualizam si astfel
i devine noul palindrom cel mai din dreapta.
*/
#include<fstream>
#include<cstring>
#define NM 1000010
#define M 2000100
using namespace std;
ifstream f("pscpld.in");
ofstream g("pscpld.out");
char s[NM],v[M];
long long i,n,t,st,dr,S,ii,p,d[M];
int main()
{
f>>(s+1);
n=strlen(s+1);
v[0]='!';
for(i=1;i<=n;i++)
{
v[++t]=s[i];
v[++t]=' ';
}
v[t]='#';
for(i=1;i<t;++i)
{
if(i<dr)
{
ii=p-(i-p);
if(d[ii]+i-1<dr)
d[i]=d[ii];
else
{
d[i]=dr-i+1;
st=i-d[i]+1;
st--;dr++;
while(v[st]==v[dr])
{ d[i]++; st--; dr++; }
dr--;
p=i;
}
}
else
{
st=dr=i;
while(v[st]==v[dr])
{ d[i]++; st--; dr++; }
dr--;
p=i;
}
}
for(i=1;i<t;i+=2)
S+=(d[i]+1)/2;
for(i=2;i<t;i+=2)
S+=d[i]/2;
g<<S;
return 0;
}