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 ;
}

你可能感兴趣的:(post)