Guest User

Untitled

a guest
May 22nd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.56 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3. #include <iostream>
  4.  
  5. #define ULL unsigned long long
  6. #define MAX 40
  7. #define FAC_LIMIT 15 // 22! nao cabe num ull
  8.  
  9. using namespace std;
  10.  
  11. // sum_u: somatorio de u[]. prod_u: produto dos factoriais de u[].
  12. ULL sum_u = 0, prod_u = 1, fact[FAC_LIMIT] = {1}, len_u, u[MAX];
  13. char alphabet[MAX];
  14.  
  15. // u: ocorrencias de cada caracter. w: string permutada.
  16. ULL perm_k(ULL u[], const char w[], ULL len_u) {
  17. ULL n = sum_u, r = prod_u, picked, k = 0;
  18.  
  19. for (int j = 0; n > 0; n--, j++) {
  20. for (picked = 0; picked < len_u; ++picked) {
  21. if (w[j] <= alphabet[picked]) break;
  22.  
  23. if (n < FAC_LIMIT) k += fact[n-1]*u[picked]/r;
  24. }
  25.  
  26. if(u[picked] < FAC_LIMIT) r /= u[picked];
  27. --u[picked];
  28. }
  29.  
  30. return k;
  31. }
  32.  
  33. void alphabetize(string &s) {
  34. alphabet[0] = s[0]; len_u = u[0] = 1;
  35.  
  36. for (unsigned int i = 1; i < s.size(); ++i) {
  37. if (s[i] != alphabet[len_u-1]) {
  38. u[len_u] = 1;
  39. alphabet[len_u++] = s[i];
  40. }
  41. else ++u[len_u-1];
  42. }
  43. }
  44.  
  45. int main() {
  46. string str, s;
  47.  
  48. for (int i = 1; i < FAC_LIMIT; ++i) fact[i] = i*fact[i-1];
  49.  
  50. while (cin >> str && str != "#") {
  51. sum_u = len_u = 0; prod_u = 1;
  52. s = str;
  53. sort(s.begin(), s.end());
  54.  
  55. alphabetize(s);
  56. for (ULL i = 0; i < len_u; ++i) {
  57. prod_u *= u[i] < FAC_LIMIT ? fact[u[i]] : fact[FAC_LIMIT-1];
  58. sum_u += u[i];
  59. }
  60.  
  61. printf("%10llu\n", perm_k(u, str.c_str(), len_u)+1);
  62. }
  63.  
  64. return 0;
  65. }
Add Comment
Please, Sign In to add comment