Pagini recente » Cod sursa (job #3266099) | Cod sursa (job #596273) | Cod sursa (job #2803925) | Cod sursa (job #1662234) | Cod sursa (job #636393)
Cod sursa(job #636393)
#include <fstream>
#include <cstring>
#define NMAX 505
#define in "palm.in"
#define out "palm.out"
using namespace std;
bool viz[257];
char sir[NMAX];
int a[NMAX][NMAX];
int maxim = 0,lg;
int dp[NMAX],start[NMAX],ct[NMAX],ctStart[NMAX];
ifstream fin(in);
ofstream fout(out);
inline int max(int a,int b)
{
return (a>b)?a:b;
}
void compute(int poz)
{
int i;
for(i = 0; i <= 256; i++)
viz[i] = 0;
for(i = 0; i < poz; i++)
if(!viz[int(sir[i])])
{
viz[int(sir[i])] = 1;
a[poz][int(sir[i])] = i;
}
for(i = poz - 1; i >= 0; i--)
if(sir[i] > sir[poz] && a[i][int(sir[poz])] != 999)
{
dp[poz] = 3;
if(start[poz] < a[i][int(sir[poz])])
start[poz] = a[i][int(sir[poz])];
}
}
int main()
{
fin.get(sir,NMAX,'\n');
fin.get();
lg = strlen(sir);
int i = 0,j;
for(i = 0; i < 501; i++)
for(j = 0; j < 501; j++)
a[i][j] = 999;
for(i = 0; i < 501; i++)
start[i] = 999,ct[i] = 1,ctStart[i] = i;
dp[0] = 0;
if(sir[1] == sir[0])
{
ct[1] = 2;
ctStart[1] = 0;
}
else
ct[1] = 1, ctStart[1] = 1;
for(i = 0; i < lg; i++)
compute(i);
for(i = 2; i < lg; i++)
for(j = i - 1; j >= 0; j--)
{
if(sir[j] > sir[i] && ctStart[j] != 999)
{
if(a[ctStart[j]][int(sir[i])] != 999)
{
if(ct[j] + 2 > dp[i])
{
dp[i] = ct[j] + 2;
start[i] = a[ctStart[j]][int(sir[i])];
}
if(ct[j] + 2 == dp[i])
if(a[ctStart[j]][int(sir[i])] < start[i])
start[i] = a[ctStart[j]][int(sir[i])];
}
}
if(sir[j] == sir[i])
{
ctStart[i] = ctStart[j];
ct[i] = ct[j] + 1;
}
if(sir[j] >= sir[i] && start[j] != 999)
if(a[start[j]][int(sir[i])] != 999)
{
if(dp[j] + 2 > dp[i])
{
dp[i] = dp[j] + 2;
start[i] = a[start[j]][int(sir[i])];
}
if(dp[j] + 2 == dp[i])
if(a[start[j]][int(sir[i])] < start[i])
start[i] = a[start[j]][int(sir[i])];
}
}
for(i = 0; i < lg; i++)
{
if(dp[i] > maxim)
maxim = dp[i];
if(ct[i] > maxim)
maxim = ct[i];
}
fout<<maxim<<'\n';
fin.close();
fout.close();
return 0;
}