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;
}
posted @ 2009-02-14 23:05  Beetlebum  阅读(366)  评论(0编辑  收藏  举报