Cod sursa(job #366261)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 21 noiembrie 2009 13:47:26
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <stdio.h>
#include <string.h>
#define N 1<<9
#define NR 666013
char a[N],b[N];
int n,m,c[N][N],last[N][27],last2[N][27],ult[27];
long long nr[N][N],sol;
inline int lit(char x)
{
	return x>='a' && x<='z';
}
inline int max(int a,int b)
{
	return a>=b ? a : b;
}
void cmlsc()
{
	int i,j;
	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]);
}
void precompute()
{
	int i,j;
	for (i=1; i<=n; i++)
	{
		ult[(int)a[i]-96]=i;
		for (j=1; j<=26; j++)
			last[i][j]=ult[j];
	}
	memset(ult,0,sizeof(ult));
	for (i=1; i<=m; i++)
	{
		ult[(int)b[i]-96]=i;
		for (j=1; j<=26; j++)
			last2[i][j]=ult[j];
	}
}
void solve()
{
	int i,j,k,ii,jj;
	for (i=1; i<=n; i++)
		for (j=1; j<=m; j++)
			if (a[i]==b[j])
			{
				if (c[i][j]==1)
					nr[i][j]=1;
				else
					for (k=1; k<=26; k++)
					{
						ii=last[i-1][k];
						jj=last2[j-1][k];
						if (c[i][j]==c[ii][jj]+1)
							nr[i][j]+=nr[ii][jj];
						if (nr[i][j]>=NR)
							nr[i][j]%=NR;
					}
				if (c[i][j]==c[n][m])
					if (last[n][(int)a[i]-96]==i && last2[m][(int)a[i]-96]==j)
						sol+=nr[i][j];
				if (sol>=NR)
					sol%=NR;
			}
	printf("%lld\n",sol);
}
int main()
{
	freopen("subsir.in","r",stdin);
	freopen("subsir.out","w",stdout);
	fgets(a+1,N,stdin);
	while (lit(a[n+1])) n++;
	fgets(b+1,N,stdin);
	while (lit(b[m+1])) m++;
	cmlsc();
	precompute();
	solve();
	return 0;
}