计蒜客 账号

https://nanti.jisuanke.com/t/42825

想了一会儿才发现数据这么小,直接枚举*所代表的字母进行统计就行了。

30分钟才解决这道简单题,还是对数据范围不够敏感。

注意对于k = 2时,两个*号所对应的字母组合不能重复,即出现过ab,就不能出现ba。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
char a,b,s[22],ss[22];
ll f[22],num[32];
ll tot,n,k,pos1 = -1,pos2 = -1;

ll calc(){
    ll sum = 1;
    memset(num,0,sizeof(num));
    for(int i = 0;i < n;i ++) num[ss[i] - 'a'] ++;
    for(int i = 0;i <= 25;i ++) sum *= f[num[i]];
    return f[n] / sum;
}

void solve(){
    ll ans = 0;
    f[0] = 1;
    for(int i = 1;i <= 17;i ++) f[i] = f[i - 1] * i;
    cin >> n >> k;
    scanf("%s",s);
    for(int i = 0;i < n;i ++){
        if(s[i] == '*' && pos1 == -1) pos1 = i;
        else if(s[i] == '*') pos2 = i;
    }
    if(k == 0){
        strcpy(ss,s);
        cout << calc() << endl;
        return;
    }
    else if(k == 1){
        for(int i = 0;i <= 25;i ++){
            strcpy(ss,s);
            ss[pos1] = (char)('a' + i);
            ans += calc();
        }
    }
    else if(k == 2){
        for(int i = 0;i <= 25;i ++){
            strcpy(ss,s);
            ss[pos1] = (char)('a' + i);
            for(int j = i;j <= 25;j ++){
                ss[pos2] = (char)('a' + j);
                ans += calc();
            }
        }
    }
    cout << ans << endl;
    return;
}
int main(){
    solve();
    return 0;
} 
View Code
posted @ 2019-12-28 19:01  cgold  阅读(214)  评论(0)    收藏  举报