Pagini recente » Cod sursa (job #2847938) | Cod sursa (job #2731869) | Cod sursa (job #1264982) | Cod sursa (job #984145) | Cod sursa (job #1551209)
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;
ifstream in("palm.in");
ofstream out("palm.out");
char t[501],s[1002];
int LPS[1002],len,lmax;
void transformaSir(char x[501])
{
int nr=1;
int lenX=strlen(x);
s[0]='#';
for(int i=0;i<lenX;i++)
{
s[i+nr]=x[i];
s[i+nr+1]='#';
nr++;
}
}
void Expand(int i)
{
/*
int lg=1;
bool ok=1;
while(i-lg>=0 && i+lg<len && ok==1)
{
if((i-lg)%2==0)
{
LPS[i]++;
lg++;
}
else
{
if(s[i-lg]==s[i+lg] && s[i-lg]<=s[i-lg+2] && s[i+lg]<=s[i+lg-2])
{
LPS[i]++;
lg++;
}
else
ok=0;
}
}
*/
bool ok=1;
while(i-LPS[i]>0 && i+LPS[i]<=len && ok==1)
{
if((i-LPS[i]-1)%2==0)
LPS[i]++;
else
{
if(s[i-LPS[i]-1]==s[i+LPS[i]+1] && s[i-LPS[i]-1]<=s[i-LPS[i]+1])
LPS[i]++;
else
ok=0;
}
}
}
int main()
{
in>>t;
transformaSir(t);
//out<<s<<"\n";
len=strlen(s);
int C=1, R=2, ii;
bool expand;
int cmax=1;
lmax=1;
LPS[1]=1;
for(int i=2;i<len;i++)
{
expand=0;
ii=2*C-i;
if(i>=R)
expand=1;
else
{
if(LPS[ii]<R-i)
LPS[i]=LPS[ii];
else //LPS[ii]>=R-i
{
LPS[i]=R-i;
expand=1;
}
}
if(expand)
Expand(i);
if(lmax<LPS[i])
{
lmax=LPS[i];
cmax=i;
}
if(i+LPS[i]>R)
{
C=i;
R=i+LPS[i];
}
}
//for(int i=0;i<len;i++)
// out<<LPS[i];
out<<lmax;
return 0;
}