Cod sursa(job #2088264)

Utilizator Consti.001FMI Dranca Constantin Consti.001 Data 14 decembrie 2017 21:37:54
Problema A+B Scor 0
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.33 kb
#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;
}