Cod sursa(job #371593)

Utilizator ciprianfFarcasanu Alexandru Ciprian ciprianf Data 5 decembrie 2009 21:39:27
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NMAX 505
#define SGM 28
#define MOD 666013
#define maxim(a, b) (a > b ? a : b)
char a[NMAX], b[NMAX];
int f1[SGM], f2[SGM];
int v[NMAX][NMAX], nr[NMAX][NMAX];
int n, m;
int main(){
	int i, j, k, max = 0;
	freopen("subsir.in", "r", stdin);
	freopen("subsir.out", "w", stdout);
	scanf("%s%s", a+1, b+1);
	n = strlen(a+1);
	m = strlen(b+1);
	for(i = 1; i <= n; ++i){
		memset(f2, 0, sizeof(f2));
		for(j = 1; j <= m; ++j){
			if(a[i] == b[j]) {
				v[i][j] = v[i-1][j-1] + 1;
				if(v[i][j] > max) max = v[i][j];
				if(v[i][j] == 1) nr[i][j] = 1;
				else for(k = 0; k <= 'z' - 'a'; ++k)
					if(f1[k] && f2[k])
						if(v[ f1[k] ][ f2[k] ] +1 == v[i][j])
							nr[i][j] = (nr[i][j] + nr[ f1[k] ][ f2[k] ])%MOD;
			}
			/*else if(v[i-1][j] > v[i][j-1]){
				v[i][j] = v[i-1][j];
				nr[i][j] = nr[i-1][j];
			}
			else if(v[i-1][j]==v[i][j-1]){
				v[i][j] = v[i-1][j];
				nr[i][j] = maxim(nr[i-1][j], nr[i][j-1]);
			}
			else {
				v[i][j] = v[i][j-1];
				nr[i][j] = nr[i][j-1];
			}*/
			f2[b[j] - 'a'] = j;
		}
		f1[a[i] - 'a'] = i;
	}
	int sum = 0;
	for(i = 1; i <= n; ++i){
		memset(f2, 0,sizeof(f2));
		for(j = 1; j <=n; ++j){
			if(f2[b[j] - 'a'] && f1[a[i] - 'a'])
				if(v[i][j] == max)
					if(v[f1[a[i] - 'a']][f2[b[j] - 'a']] != v[i][j])
						sum += nr[i][j];
			f2[b[j] - 'a'] = j;
		}
		f1[a[i] - 'a'] = i;
	}
	printf("%d\n", nr[n][m]);
	return 0;
}