v 0. Pasted by UnderFelixAbove as cpp at 2010-05-18 21:47:59 MSK and set expiration to never.

Paste will expire never.

  1. // Меньшиков. Тренировка 3.
  2. // 3B. Перестановки (2) [permut2]
  3. // Рекурсивная реализация с подсчетом элементов
  4. // ibelyaev: 28Feb2010
  5. #include <iostream>
  6. #include <string>
  7. #include <vector>
  8.  
  9. using namespace std;
  10.  
  11. string letters,perm;
  12. vector<int>  amounts;
  13. int n;
  14. void input()
  15. {
  16.     string str;
  17.     cin>>str;
  18.     n = str.size();
  19.     for (int i =0;i<str.size();i++)
  20.     {
  21.         bool isExist = false;
  22.         for (int j = 0;j<letters.size();j++)
  23.         {
  24.             if (letters[j] == str[i])
  25.             {
  26.                 amounts[j]++;
  27.                 isExist = true;
  28.             }
  29.         }
  30.         if (!isExist)
  31.         {
  32.             letters.push_back(str[i]);
  33.             amounts.push_back(1);
  34.         }
  35.     }
  36. }
  37. void output()
  38. {
  39.     //[cout - 0.2 c,printf 0.02 c]
  40.     cout<<perm<<endl;
  41. }
  42. void rec(int pos)
  43. {
  44.     if (pos == n)
  45.         output();
  46.     for (int i=0;i<letters.size();i++)
  47.     {
  48.         if (amounts[i])
  49.         {
  50.             perm[pos] = letters[i];
  51.             amounts[i]--;
  52.             rec(pos+1);
  53.             amounts[i]++;
  54.             perm[pos] = '*'; // for debug only
  55.         }
  56.  
  57.     }
  58. }
  59. void solve()
  60. {
  61.     perm = string(n,'*');
  62.     rec(0);
  63. }
  64. int main()
  65. {
  66.     input();
  67.     solve();
  68.     return 0;
  69. }


Editing is locked.