pku1240 Pre-Post-erous!
有意思的题~
注意到两个序列一定符合以下性质:
s1:@abcd...
s2:abcd...@
其中@为子孙群abcd...的祖先
故可用递归解决
#include <iostream>
using namespace std;
char s1[30],s2[30];
int m,len,loop,ans;
int c(int n,int m){
if(n>m-n)
n=m-n;
int i,k=m-n+1,ret=1;
for(i=0;i<n;i++)ret=ret*(k+i)/(i+1);
return ret;
}
void dfs(int p1,int p2){
int i,arm=0;
if(p1>p2)return;
for(i=p1;i<=p2;i++){
if(s2[i]==s1[loop]){
loop++;
dfs(p1,i-1);
p1=i+1;
arm++;
}
}
ans*=c(arm,m);
}
int main(){
while(scanf("%d",&m) && m){
scanf("%s %s",&s1,&s2);
len=strlen(s1);
loop=1;
ans=1;
dfs(0,len-2);
printf("%d\n",ans);
}
return 0;
}
using namespace std;
char s1[30],s2[30];
int m,len,loop,ans;
int c(int n,int m){
if(n>m-n)
n=m-n;
int i,k=m-n+1,ret=1;
for(i=0;i<n;i++)ret=ret*(k+i)/(i+1);
return ret;
}
void dfs(int p1,int p2){
int i,arm=0;
if(p1>p2)return;
for(i=p1;i<=p2;i++){
if(s2[i]==s1[loop]){
loop++;
dfs(p1,i-1);
p1=i+1;
arm++;
}
}
ans*=c(arm,m);
}
int main(){
while(scanf("%d",&m) && m){
scanf("%s %s",&s1,&s2);
len=strlen(s1);
loop=1;
ans=1;
dfs(0,len-2);
printf("%d\n",ans);
}
return 0;
}