计蒜客 账号
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; }

浙公网安备 33010602011771号