Cod sursa(job #1337336)

Utilizator livliviLivia Magureanu livlivi Data 8 februarie 2015 21:19:15
Problema Subsir Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<cstdio>
using namespace std;

int d[501][502];
char ce[501][501];

char a[501];
char b[501];


int cnt(int x,int y){
    int rez=0,k1=0,k2=0;

    if (x==0 ||y==0) return 0;

    if (a[x]==b[y] &&d[x][y]==d[x-1][y-1]+1){
        k1=ce[x][y];
        rez=cnt(x-1,y-1);
        if (rez==0) rez=1;
    }

    if (d[x][y]==d[x-1][y] &&k1!=ce[x-1][y]){
        k2=ce[x-1][y];
        rez+=cnt(x-1,y);
    }

    if (d[x][y]==d[x][y-1] &&k1!=ce[x][y-1] &&k2!=ce[x][y-1])
        rez+=cnt(x,y-1);

    return rez;
}


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

    gets(a+1);
    gets(b+1);

    n=1;
    while(a[n+1]!=0) n++;
    m=1;
    while(b[m+1]!=0) m++;

    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++){
            if (a[i]==b[j]){
                d[i][j]=d[i-1][j-1]+1;
                ce[i][j]=a[i];
            }
            if (d[i-1][j]>d[i][j]){
                d[i][j]=d[i-1][j];
                ce[i][j]=ce[i-1][j];
            }
            if (d[i][j-1]>d[i][j]){
                d[i][j]=d[i][j-1];
                ce[i][j]=ce[i][j-1];
            }
        }

    printf ("%d",cnt(n,m));
    return 0;
}