Cod sursa(job #474077)

Utilizator edp100Edp100 edp100 Data 2 august 2010 14:10:13
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include<stdio.h>
#include<string.h>

#define maxim(a,b) (a>b ? a : b)

int sol[503][503];
int d[503][503],p[32];
char s1[506],s2[506];
int ap1[506][32],n2;
int ap2[506][32],n1;

int main ()
{
    int i,j,t;
    freopen("subsir.in","r",stdin);
    freopen("subsir.out","w",stdout);
    gets(s1);
    gets(s2);
    n1=strlen(s1);
    n2=strlen(s2);
    for(i=0;i<n1;i++)
    {
        for(j=0;j<26;j++)
            ap1[i][j]=p[j];
        p[s1[i]-'a']=i+1;
    }
    memset(p,0,sizeof(p));
    for(i=0;i<n2;i++)
    {
        for(j=0;j<26;j++)
            ap2[i][j]=p[j];
        p[s2[i]-'a']=i+1;
    }
    sol[0][0]=1;
    for(i=1;i<=n1;i++)
        for(j=1;j<=n2;j++)
        {
            if(s1[i-1]==s2[j-1])
            {
                d[i][j]=d[i-1][j-1]+1;
                sol[i][j]=sol[i-1][j-1];
                if(!sol[i][j])
                    sol[i][j]=1;
                continue;
            }
            d[i][j]=maxim(d[i-1][j],d[i][j-1]);
            for(t=0;t<26;t++)
            {
                if(!ap1[i][t] || !ap2[j][t])
                    continue;
                if(d[ap1[i][t]][ap2[j][t]]+1==d[i][j])
                    sol[i][j]+=sol[ap1[i][t]][ap2[j][t]];
            }
        }
    printf("%d\n",sol[n1][n2]);
    return 0;
}