Cod sursa(job #1684538)

Utilizator ASTELOTudor Enescu ASTELO Data 11 aprilie 2016 09:46:34
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.45 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct eu{int val,x,y;};
eu a[501][501];
struct eu2{char s[501];};
eu2 v[1001];
int i,j,n,m,k,maxim,cate;
char s[501],s1[501],s2[501];
void creez(char vec[501],int x,int y,int maxim1)
    {
    int i,j;
    i=x;
    j=y;
    if(maxim1==0)
        {
        cate++;
        for(i=1;i<=maxim;i++)
            v[cate].s[i]=vec[maxim-i+1];
        }
    else
        {
        int aux;
        while(a[i][j].val==a[a[i][j].x][a[i][j].y].val)
            {
            aux=i;
            i=a[i][j].x;
            j=a[aux][j].y;
            }
        vec[maxim-maxim1+1]=s[i];
        creez(vec,i-1,j-1,maxim1-1);
        }
    }
bool sorting(eu2 a,eu2 b)
    {
    int i;
    for(i=1;i<=maxim;i++)
        {
        if(a.s[i]<b.s[i])
            return 1;
        if(a.s[i]>b.s[i])
            return 0;
        }
    return 1;
    }
int main ()
{
freopen("subsir.in","r",stdin);
freopen("subsir.out","w",stdout);
gets(s);
gets(s1);
n=strlen(s);
m=strlen(s1);
for(i=n;i>=1;i--)
    s[i]=s[i-1];
for(i=m;i>=1;i--)
    s1[i]=s1[i-1];
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        {
        if(s[i]==s1[j])
            {
            if(a[i-1][j-1].val+1>=a[i-1][j].val&&a[i-1][j-1].val+1>=a[i][j-1].val)
                {
                a[i][j].val=a[i-1][j-1].val+1;
                a[i][j].x=i-1;
                a[i][j].y=j-1;
                }
            else
                if(a[i-1][j].val>a[i][j-1].val)
                    {
                    a[i][j].val=a[i-1][j].val;
                    a[i][j].x=i-1;
                    a[i][j].y=j;
                    }
                else
                    {
                    a[i][j].val=a[i][j-1].val;
                    a[i][j].x=i;
                    a[i][j].y=j-1;
                    }
            }
        }
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        if(a[i][j].val>maxim)
            maxim=a[i][j].val;
for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
        if(a[i][j].val==maxim&&a[i-1][j-1].val<maxim)
            {
            s2[1]=s[i];
            creez(s2,i-1,j-1,maxim-1);
            }
sort(v+1,v+cate+1,sorting);
int nr=0;
for(i=1;i<=cate;i++)
    {
    int pp=0;
    for(j=1;j<=maxim;j++)
        if(v[i].s[j]!=v[i-1].s[j])
            {
            pp=1;
            break;
            }
    if(pp==0)
        nr++;
    }
printf("%d",nr);
return 0;
}