Cod sursa(job #373011)

Utilizator swift90Ionut Bogdanescu swift90 Data 12 decembrie 2009 14:04:25
Problema Subsir Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#define REST 666013
char a[512],b[512];
int ss[512][512],sol[512][512],pa[512][32],pb[512][32];
int n,m;
inline int max(int x,int y){
	return x>y?x:y;
}
int main(){
	freopen("subsir.in","r",stdin);
	freopen("subsir.out","w",stdout);
	int i,j,k,p1,p2,so=0;
	fgets(a+1,510,stdin);
	fgets(b+1,510,stdin);
	for(n=1;'a'<=a[n] && a[n]<='z';++n);
	--n;
	for(m=1;'a'<=b[m] && b[m]<='z';++m);
	--m;
	
	for(i=1;i<=n;++i){
		for(j=1;j<=m;++j){
			if(a[i]==b[j])
				ss[i][j]=1+ss[i-1][j-1];
			else
				ss[i][j]=max(ss[i-1][j],ss[i][j-1]);
		}
	}
	for(i=0;i<26;++i)
		pa[0][i]=pb[0][i]=999999999;
	
	for(i=1;i<=n;++i){
		for(k=0;k<26;++k){
			pa[i][k]=pa[i-1][k];
		}
		pa[i][a[i]-'a']=i;
	}
	for(i=1;i<=m;++i){
		for(k=0;k<26;++k){
			pb[i][k]=pb[i-1][k];
		}
		pb[i][b[i]-'a']=i;
	}
	
	for(i=1;i<=n;++i){
		for(j=1;j<=m;++j){
			if(a[i]!=b[j])
				continue;
			if(ss[i][j]==1){
				sol[i][j]=1;
				continue;
			}
			for(k=0;k<26;++k){
				p1=pa[i-1][k];
				p2=pb[j-1][k];
				if(p1<i && p2<j && 1+ss[p1][p2]==ss[i][j]){
					sol[i][j]+=sol[p1][p2];
					if(sol[i][j]>=REST)
						sol[i][j]-=REST;
				}
			}
		}
	}
	
	for(i=0;i<26;++i){
		p1=pa[n][i];
		p2=pb[m][i];
		if(p1<=n && p2<=m && ss[p1][p2]==ss[n][m]){
			so+=sol[p1][p2];
			if(so>=REST)
				so-=REST;
		}
	}
	printf("%d\n",so);
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}