Cod sursa(job #177095)

Utilizator bogdanhm999Casu-Pop Bogdan bogdanhm999 Data 12 aprilie 2008 12:02:53
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 kb
#include <stdio.h>
#include <string.h>
#define max(x,y) ((x>y)?x:y)

char a[505],b[505];
long n,m,i,j;
unsigned char C[505][505];
long v[505][505];

void cmlsc(){
    
    for (i=0;i<=n;i++)v[i][0]=1;
    for (j=0;j<=m;j++)v[0][j]=1;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (a[i]==b[j]){
               C[i][j]=C[i-1][j-1]+1;
               v[i][j]=v[i-1][j-1];
               if (a[i-1]==b[j])v[i][j]++;
               if (a[i]==b[j-1])v[i][j]++;
            }
            else if (C[i-1][j]>C[i][j-1]){
                    C[i][j]=C[i-1][j];
                    v[i][j]=v[i-1][j];
                 }
                 else if (C[i-1][j]<C[i][j-1]){
                         C[i][j]=C[i][j-1];
                         v[i][j]=v[i][j-1];
                       }
                       else{
                            C[i][j]=C[i][j-1];
                            if (a[i-1]==b[j]||a[i]==b[j-1]){
                               v[i][j]=v[i-1][j]+v[i][j-1];
                            }
                            else v[i][j]=(v[i-1][j]>v[i][j-1])?v[i-1][j]:v[i][j-1];
                       }
}

int main(){
    freopen("subsir.in","r",stdin);
    freopen("subsir.out","w",stdout);

    scanf("%s\n%s",a+1,b+1);
    n=strlen(a+1);
    m=strlen(b+1);
    
    cmlsc();
    /*
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++)
            printf("%ld ",C[i][j]);
        printf("\n");
    }
    printf("\n");
    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++)
            printf("%ld ",v[i][j]);
        printf("\n");
    }
    */
    printf("%ld\n",v[n][m]);
    
return 0;
}