p1500.cpp

来自「高手写的所有acm例程 在acm.zju.edu.cn 上的题目的例程」· C++ 代码 · 共 51 行

CPP
51 行
字号
// p1500.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include <stdio.h>
#include <string.h>

int	N , len1 , len2;
char	Order1 [40] , Order2 [40] , Pos [26];

int	C ( int a , int b )
{
	if ( a < b ) return 0;
	int	ret , i;
	if ( a - b < b ) b = a - b;
	for ( ret = i = 1; i <= b; i ++ ) ret = ret * ( a - i + 1 ) / i;
	return ret;
}

int	kind ( int left , int right )
{
	int	ret = 1 , l , SubTree , Last;
	l = Pos [Order1 [left]] + left - right , left ++;

	for ( SubTree = 0; left <= right; left += Last , l += Last , SubTree ++ )
		Last = Pos [Order1 [left]] - l + 1 , ret *= kind ( left , left + Last - 1 );
	ret *= C ( N , SubTree );
	return ret;
}

int	Ans ()
{
	int	i;
	len1 = strlen ( Order1 ) , len2 = strlen ( Order2 );
	for ( i = 0; i < len1; i ++ ) Order1 [i] -= 'a';
	for ( i = 0; i < len2; i ++ ) Order2 [i] -= 'a' , Pos [Order2 [i]] = i;
	return kind ( 0 , len1 - 1 );
}

int main(int argc, char* argv[])
{
	freopen ( "p.in" , "r" , stdin );

	while ( scanf ( "%d" , &N ) , N ) {
		scanf ( "%s %s" , Order1 , Order2 );
		printf ( "%d\n" , Ans () );
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?