Pagini recente » Cod sursa (job #685086) | Cod sursa (job #1735431) | Cod sursa (job #2098522) | Statistici C.N.T.V. (cntv) | Cod sursa (job #2088264)
#include<fstream>
#include<iostream>
#include<algorithm>
#include<cstring>
#define infinitul 9999999
using namespace std;
ifstream f("data.in");
ofstream g("data.out");
struct vectu
{
int cut,ant;
};
int main()
{
char *s=new char;
int n,palindrome_count;
f>>s;
n=strlen(s);
bool mat[n+2][n+1];
palindrome_count=n;
int mat_count[n+2][n+1];
for(int i=1;i<=n;++i)
{
mat[0][i]=true;
mat[1][i]=true;
mat_count[0][i]=0;
mat_count[1][i]=1;
}
for(int i=2;i<=n;++i)
{
for(int j=1;(j+i-1)<=n;++j)
{
mat_count[i][j]=0;
if(s[j-1]==s[j+i-2])
{
if(mat[i-2][j+1]==true)
{
mat[i][j]=true;
palindrome_count++;
mat_count[i][j]++;
}
else
mat[i][j]=false;
}
else
{
mat[i][j]=false;
}
mat_count[i][j]+=(mat_count[i-1][j]+mat_count[i-1][j+1])-mat_count[i-2][j+1];
}
}
vectu c[n];
for(int i=1;i<=n;++i)
{
if(mat[i][1]==true)
{c[i].cut=0;
c[i].ant=-1;
}
else
{
//cout<<i<<":\n";
c[i].cut=infinitul;
for(int line=i,col=1;line>1;--line,++col)
{
//cout<<line<<" "<<col<<"\n";
if(mat[line-1][col+1]==true&&(1+c[i-line+1].cut)<c[i].cut)
{
c[i].cut=c[i-line+1].cut+1;
c[i].ant=i-line+1;
}
}
//cout<<"\n\n\n";
}
}
g<<mat_count[n][1]<<"\n";
g<<c[n].cut+1<<"\n";
int x=c[n].ant,anterior=n;
while(x!=-1)
{
for(int i=x;i<anterior;++i)
g<<s[i];
g<<"\n";
anterior=x;
x=c[x].ant;
}
for(int i=0;i<anterior;++i)
g<<s[i];
/*g<<palindrome_count<<"\n\n\n";
for(int i=0;i<=n;++i)
{
for(int j=1;j+i-1<=n;++j)
g<<mat[i][j]<<" ";
g<<"\n";
}
g<<"\n\n\n";
for(int i=0;i<=n;++i)
{
for(int j=1;j+i-1<=n;++j)
g<<mat_count[i][j]<<" ";
g<<"\n";
}
*/
return 0;
}