Wrong Word

题目描述 

有一个长度且只包含大写字母的单词。我们在写作时不小心把它写错了,写错的单词与正确的单词中每种字母的个数相同,那么有多少种不同的写错的单词呢?

输入描述:

输入一行字符串,长度
且只包含大写字母

输出描述:

输出一个整数,即答案
示例1

输入

复制
EYE

输出

复制
2

说明

写错的单词有两种:YEE、EEY
示例2

输入

复制
ZZZZZZZZ

输出

复制
0
示例3

输入

复制
ACCEPT

输出

复制
359
组合数学中常用结论:不全相异元素的全排列。这里有k种字母,第i种有a[i]个,总共N个。它们能排列出多少个单词?
答案是: 这很好证明,做全排列有N!种可能,但有a[1]个相同的,这a[1]个不考虑次序,除以a[1]!,等等。答案就是这个不全相异的全排列数-1
 1 //
 2 // Created by w on 2020/11/28.
 3 //
 4 
 5 #include<bits/stdc++.h>
 6 using namespace std;
 7 typedef long long ll;
 8 ll n,m[11],k[200];
 9 string s;
10 int main()
11 {
12     m[0]=1;
13     for(int i=1;i<=10;i++)
14     {//计算阶乘,数据范围小直接读出阶乘即可
15         m[i]=i*m[i-1];
16     }
17     cin>>s;
18     n=s.size();
19     ll ans=m[n];//保存n!
20     for(int i=0;i<n;i++)
21         k[s[i]]++;//桶排序,记录不同字母个数
22     for(int i='A';i<='Z';i++){
23         ans/=m[k[i]];//除以相同的字母的阶乘
24     }
25     cout<<ans-1<<'\n';
26 }

 

posted @ 2020-11-28 00:39  BlackSnow  阅读(173)  评论(0)    收藏  举报