Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <set>
- #include <string>
- using namespace std; // C++ :)
- const int N = 10; // similar cu #define
- char cuv1[N], cuv2[N]; // cele 2 cuvinte de maxim 9 litere + null
- bool alpha[26]; // marcam cu 1/0 aparitia unei litere prin index
- char avail[N]; // aici pastram litere din care adaugam in fata sau dupa cuv2
- bool status = true; // daca se poate sau nu sa formam macar un cuvant care sa contine pe cuv2
- int total; // litere disponibile pentru generari
- bool used[26]; // folosit in functia back pentru a sti daca am folosit litera x din used[x]
- char left[N], right[N]; // ceea ce urmeaza concatenat in stanga si in dreapta generat in back
- int lPos, rPos; // ca sa stim unde facem adaugari in left si right
- set<string> unique;
- inline int geti(char chr)
- {
- return chr - 'A';
- }
- void back(int where /* 0-stanga 1-dreapta */)
- {
- /* acum generam daca mai avem litere la dispozitie */
- if (lPos + rPos < total) {
- for (int i = 0; i < total; ++i) { // pentru fiecare litera din cele disponibile
- int ind = geti(avail[i]);
- if (!used[ind]) { // daca nu am folosit-o inca in stanga sau in dreapta
- used[ind] = true; // o folosim
- if (where == 0) { // in stanga
- left[lPos++] = avail[i];
- } else { // sau in dreapta
- right[rPos++] = avail[i];
- }
- string tmp;
- tmp.append(left, lPos);
- tmp.append(cuv2);
- tmp.append(right, rPos);
- unique.insert(tmp);
- back(0); // mergem mai departe cu backul in stanga
- back(1); // apoi in dreapta
- /* si acum revenim */
- if (where == 0) { // in stanga
- left[--lPos] = '\0';
- } else { // sau in dreapta
- right[--rPos] = '\0';
- }
- used[ind] = false; // nu o mai folosim
- }
- }
- }
- }
- void solve()
- {
- for (char* it = cuv1; *it; ++it) { // iteram fiecare pozitie din vector
- int ind = geti(*it);
- if (!alpha[ind]) { // afisam o singura data litera
- alpha[ind] = true;
- printf("%c ", *it);
- }
- }
- putchar('\n');
- for (char* it = cuv2; *it && status; ++it) {
- int ind = geti(*it);
- //fprintf(stderr, "%d ", ind);
- if (alpha[ind]) { // avem disponibila fiecare litera din cuv2
- alpha[ind] = false; // o marcam ca si folosita
- } else {
- status = false; // ne lipseste o litera de aceea distincta din cuv1
- } // de care avem nevoie sa construim un cuvant care sa-l contina si pe cuv2
- }
- if (status) { // daca totul e ok
- for (int i = 0; i < 26; ++i) { // vedem ce litere mai avem disponibile
- if (alpha[i]) {
- //fprintf(stderr, "%d ", i);
- avail[total++] = i + 'A';
- }
- }
- avail[total] = '\0'; // adaugam null byteul ca sa fie un sir valabil
- //fprintf(stderr, "%d\n", total);
- back(0); // generam toate cuvintele pornind de la cuv1,
- back(1); // si in dreapta
- for (set<string>::iterator it = unique.begin(); it != unique.end(); ++it) {
- printf("%s\n", it->c_str());
- }
- } // adaugand litere intr-o parte si in alta
- }
- int main()
- {
- freopen("cuvinte.in", "rt", stdin); // deschidem fisiere pe care
- freopen("cuvinte.out", "wt", stdout); // le redirectionam catre dispozitivul standard (tastatura)
- scanf("%s %s", cuv1, cuv2); // citim
- solve(); // rezolvam
- fclose(stdin); // inchidem ce am deschis
- fclose(stdout);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement