Advertisement
cmiN

cuvinte

Jan 28th, 2012
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.72 KB | None | 0 0
  1. #include <cstdio>
  2. #include <set>
  3. #include <string>
  4. using namespace std; // C++ :)
  5.  
  6.  
  7. const int N = 10; // similar cu #define
  8. char cuv1[N], cuv2[N]; // cele 2 cuvinte de maxim 9 litere + null
  9. bool alpha[26]; // marcam cu 1/0 aparitia unei litere prin index
  10. char avail[N]; // aici pastram litere din care adaugam in fata sau dupa cuv2
  11. bool status = true; // daca se poate sau nu sa formam macar un cuvant care sa contine pe cuv2
  12. int total; // litere disponibile pentru generari
  13. bool used[26]; // folosit in functia back pentru a sti daca am folosit litera x din used[x]
  14. char left[N], right[N]; // ceea ce urmeaza concatenat in stanga si in dreapta generat in back
  15. int lPos, rPos; // ca sa stim unde facem adaugari in left si right
  16. set<string> unique;
  17.  
  18.  
  19. inline int geti(char chr)
  20. {
  21.     return chr - 'A';
  22. }
  23.  
  24.  
  25. void back(int where /* 0-stanga 1-dreapta */)
  26. {
  27.     /* acum generam daca mai avem litere la dispozitie */
  28.     if (lPos + rPos < total) {
  29.         for (int i = 0; i < total; ++i) { // pentru fiecare litera din cele disponibile
  30.             int ind = geti(avail[i]);
  31.             if (!used[ind]) { // daca nu am folosit-o inca in stanga sau in dreapta
  32.                 used[ind] = true; // o folosim
  33.                 if (where == 0) { // in stanga
  34.                     left[lPos++] = avail[i];
  35.                 } else { // sau in dreapta
  36.                     right[rPos++] = avail[i];
  37.                 }
  38.                 string tmp;
  39.                 tmp.append(left, lPos);
  40.                 tmp.append(cuv2);
  41.                 tmp.append(right, rPos);
  42.                 unique.insert(tmp);
  43.                 back(0); // mergem mai departe cu backul in stanga
  44.                 back(1); // apoi in dreapta
  45.                 /* si acum revenim */
  46.                 if (where == 0) { // in stanga
  47.                     left[--lPos] = '\0';
  48.                 } else { // sau in dreapta
  49.                     right[--rPos] = '\0';
  50.                 }
  51.                 used[ind] = false; // nu o mai folosim
  52.             }
  53.         }
  54.     }
  55. }
  56.  
  57.  
  58. void solve()
  59. {
  60.     for (char* it = cuv1; *it; ++it) { // iteram fiecare pozitie din vector
  61.         int ind = geti(*it);
  62.         if (!alpha[ind]) { // afisam o singura data litera
  63.             alpha[ind] = true;
  64.             printf("%c ", *it);
  65.         }
  66.     }
  67.     putchar('\n');
  68.     for (char* it = cuv2; *it && status; ++it) {
  69.         int ind = geti(*it);
  70.         //fprintf(stderr, "%d ", ind);
  71.         if (alpha[ind]) { // avem disponibila fiecare litera din cuv2
  72.             alpha[ind] = false; // o marcam ca si folosita
  73.         } else {
  74.             status = false; // ne lipseste o litera de aceea distincta din cuv1
  75.         } // de care avem nevoie sa construim un cuvant care sa-l contina si pe cuv2
  76.     }
  77.     if (status) { // daca totul e ok
  78.         for (int i = 0; i < 26; ++i) { // vedem ce litere mai avem disponibile
  79.             if (alpha[i]) {
  80.                 //fprintf(stderr, "%d ", i);
  81.                 avail[total++] = i + 'A';
  82.             }
  83.         }
  84.         avail[total] = '\0'; // adaugam null byteul ca sa fie un sir valabil
  85.         //fprintf(stderr, "%d\n", total);
  86.         back(0); // generam toate cuvintele pornind de la cuv1,
  87.         back(1); // si in dreapta
  88.         for (set<string>::iterator it = unique.begin(); it != unique.end(); ++it) {
  89.             printf("%s\n", it->c_str());
  90.         }
  91.     } // adaugand litere intr-o parte si in alta
  92. }
  93.  
  94.  
  95. int main()
  96. {
  97.     freopen("cuvinte.in", "rt", stdin); // deschidem fisiere pe care
  98.     freopen("cuvinte.out", "wt", stdout); // le redirectionam catre dispozitivul standard (tastatura)
  99.     scanf("%s %s", cuv1, cuv2); // citim
  100.     solve(); // rezolvam
  101.     fclose(stdin); // inchidem ce am deschis
  102.     fclose(stdout);
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement