Cod sursa(job #205571)

Utilizator zombie_testertest test zombie_tester Data 1 septembrie 2008 21:35:04
Problema Subsir Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
# include <cstdio>
# include <string>

using namespace std;

# define FIN "subsir.in"
# define FOUT "subsir.out"
# define max(a,b) (a>b?a:b)
# define MAXN 505
# define Sigma 26

char A[MAXN];
char B[MAXN];

int i,j,N,M,k;

int C[MAXN][MAXN];
int NextA[MAXN][Sigma];
int NextB[MAXN][Sigma];
int L[MAXN][MAXN];

    int main()
    {
        freopen(FIN,"r",stdin);
        freopen(FOUT,"w",stdout);
        
        gets(A+1);
        gets(B+1);
        
        N = strlen(A+1);
        M = strlen(B+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;
            else
              C[i][j] = max(C[i-1][j],C[i][j-1]);
              
        for (i = 1; i <= N; ++i)
          for (j = 0; j < Sigma; ++j)
            if (A[i] == j+'a')
              NextA[i][j] = i;
            else
              NextA[i][j] = NextA[i-1][j];
              
        for (i = 1; i <= M; ++i)
          for (j = 0; j < Sigma; ++j)
            if (B[i] == j+'a')
              NextB[i][j] = i;
            else
              NextB[i][j] = NextB[i-1][j];
              
        for (i = 1; i <= N; ++i)
          for (j = 1; j <= M; ++j)
            if (A[i] == B[j])
              {  
                 if (C[i][j] == 1) L[i][j] = 1;
                 for (k = 0; k < Sigma; ++k)
                   if (C[NextA[i-1][k]][NextB[j-1][k]]+1==C[i][j])
                     L[i][j] += L[NextA[i-1][k]][NextB[j-1][k]];
              }
                  
        int sol = 0;
        for (i = 0; i < Sigma; ++i)
          if (C[NextA[N][i]][NextB[M][i]] == C[N][M])
            sol += L[NextA[N][i]][NextB[M][i]];
          
        printf("%d",sol); 
        
        return 0;
    }