Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <algorithm>
- #include <cstdio>
- #include <iostream>
- #define ULL unsigned long long
- #define MAX 40
- #define FAC_LIMIT 15 // 22! nao cabe num ull
- using namespace std;
- // sum_u: somatorio de u[]. prod_u: produto dos factoriais de u[].
- ULL sum_u = 0, prod_u = 1, fact[FAC_LIMIT] = {1}, len_u, u[MAX];
- char alphabet[MAX];
- // u: ocorrencias de cada caracter. w: string permutada.
- ULL perm_k(ULL u[], const char w[], ULL len_u) {
- ULL n = sum_u, r = prod_u, picked, k = 0;
- for (int j = 0; n > 0; n--, j++) {
- for (picked = 0; picked < len_u; ++picked) {
- if (w[j] <= alphabet[picked]) break;
- if (n < FAC_LIMIT) k += fact[n-1]*u[picked]/r;
- }
- if(u[picked] < FAC_LIMIT) r /= u[picked];
- --u[picked];
- }
- return k;
- }
- void alphabetize(string &s) {
- alphabet[0] = s[0]; len_u = u[0] = 1;
- for (unsigned int i = 1; i < s.size(); ++i) {
- if (s[i] != alphabet[len_u-1]) {
- u[len_u] = 1;
- alphabet[len_u++] = s[i];
- }
- else ++u[len_u-1];
- }
- }
- int main() {
- string str, s;
- for (int i = 1; i < FAC_LIMIT; ++i) fact[i] = i*fact[i-1];
- while (cin >> str && str != "#") {
- sum_u = len_u = 0; prod_u = 1;
- s = str;
- sort(s.begin(), s.end());
- alphabetize(s);
- for (ULL i = 0; i < len_u; ++i) {
- prod_u *= u[i] < FAC_LIMIT ? fact[u[i]] : fact[FAC_LIMIT-1];
- sum_u += u[i];
- }
- printf("%10llu\n", perm_k(u, str.c_str(), len_u)+1);
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment