记录编号 241923 评测结果 AAAAAAAAAA
题目名称 [HAOI 2010]最长公共子序列 最终得分 100
用户昵称 Gravatar‎MistyEye 是否通过 通过
代码语言 C++ 运行时间 1.296 s
提交时间 2016-03-26 10:43:17 内存使用 119.25 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#define maxn 5100
using namespace std;
int n[maxn][maxn],m[maxn][maxn];
void mod(int &a){a=(a+100000000)%100000000;}
int wo(){
	freopen("lcs.in","r",stdin);
	freopen("lcs.out","w",stdout);
	string a,b;
	cin >>a >>b;
	int la=a.size()-1, lb=b.size()-1;
	a='0'+a;b='0'+b;
	for(int i=0; i<=la; i++)m[i][0]=1;
	for(int i=1; i<=lb; i++)m[0][i]=1;
	for(int i=1; i<=la; i++)
		for(int j=1; j<=lb; j++){
			if(a[i]==b[j])n[i][j]=n[i-1][j-1]+1,
				m[i][j]=m[i-1][j-1];	
			else n[i][j]=max(n[i][j-1],n[i-1][j]);
				
			if(n[i][j-1]==n[i][j])m[i][j]+=m[i][j-1];
			if(n[i-1][j]==n[i][j])m[i][j]+=m[i-1][j];
			if(n[i-1][j-1]==n[i][j]&&a[i]!=b[j])
				m[i][j]-=m[i-1][j-1];
			
			mod(m[i][j]); 
		}
		
	printf("%d\n%d",n[la][lb],m[la][lb]);
	return 0;
}
int aaa=wo();
int main(){;}