Cod sursa(job #203772)

Utilizator tvladTataranu Vlad tvlad Data 19 august 2008 14:18:38
Problema Subsir Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.61 kb
#include <cstdio>

const int SIG = 26;
const int N = 10;//510;

int n,m, cmax;
char a[N], b[N];
int la[N][SIG], lb[N][SIG];
int c[N][N], nr[N][N];

inline int max ( int a, int b ) { return (a > b) ? a : b; }

int main() {
	freopen("subsir.in","rt",stdin);
	freopen("subsir.out","wt",stdout);
	a[0] = b[0] = ' ';
	fgets(a+1,N,stdin);
	fgets(b+1,N,stdin);
	for (n = 0; a[n] != '\n' && a[n] != '\0'; ++n);
	la[1][a[1]-'a'] = 1;
	for (int i = 2; i < n; ++i) {
		for (int j = 'a'; j <= 'z'; ++j) {
			if (a[i] == j)
				la[i][j-'a'] = i; else
				la[i][j-'a'] = la[i-1][j-'a'];
		}
	}
	for (m = 0; b[m] != '\n' && b[m] != '\0'; ++m);
	lb[1][b[1]] = 1;
	for (int i = 2; i < n; ++i) {
		for (int j = 'a'; j <= 'z'; ++j) {
			if (b[i] == j)
				lb[i][j-'a'] = i; else
				lb[i][j-'a'] = lb[i-1][j-'a'];
		}
	}
	for (int j = 0; j < m; ++j) c[0][j] = 0;
	cmax = 0;
	for (int i = 1; i < n; ++i) {
		c[i][0] = 0;
		for (int 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]);
			if (c[i][j] > cmax) cmax = c[i][j];
		}
	}
	for (int i = 1; i < n; ++i) {
		for (int j = 1; j < m; ++j) {
			if (a[i] == b[j]) {
				if (c[i][j] == 1) {
					nr[i][j] = 1;
				} else {
					for (int s = 'a'; s <= 'z'; ++s) {
						int ii = la[i][s-'a'], jj = lb[j][s-'a'];
						if (c[i][j] == c[ii][jj] + 1) {
							nr[i][j] += nr[ii][jj];
						}
					}
				}
			}
		}
	}
	int r = 0;
	for (int s = 'a'; s <= 'z'; ++s)
		if (c[la[n-1][s-'a']][lb[n-1][s-'a']] == cmax)
			r += nr[la[n-1][s-'a']][lb[n-1][s-'a']];
	printf("%d\n",r);
	return 0;
}