Se consideră un şir de cuvinte separate două câte două printr-un spaţiu. Fiecare cuvânt este caracterizat prin numărul de ordine care reprezintă poziţia lui în şirul de cuvinte (primul cuvânt are numărul de ordine 1
). Unui cuvânt i se pot aplica în mod repetat următoarele transformări: primul caracter al cuvântului (cel mai din stânga) se şterge de acolo şi se adaugă după ultimul caracter din cuvânt. Astfel, dintr-un cuvânt s
cu k
caractere se pot obţine alte k-1
cuvinte pe care le numim cuvinte obţinute din transformarea cuvântului s
. De exemplu, dintr-un cuvânt format din 4
caractere c1c2c3c4
, cuvintele obţinute prin transformarea lui sunt: c2c3c4c1
, c3c4c1c2
, c4c1c2c3
.
Se caută în şirul de cuvinte prima pereche de cuvinte vecine (a,b)
, în care al doilea cuvânt din pereche (cuvântul b)
este identic cu un cuvânt obţinut din transformarea lui a
. Dacă există o astfel de pereche, se şterge cuvântul b
din şir. Prin ştergerea cuvântului b
din şir, acesta va avea mai puţin cu un cuvânt! Se repetă operaţia de căutare de mai sus până când în şirul rămas nu mai există o pereche (a,b)
de cuvinte vecine, astfel încât b
să fie obţinut prin transformarea lui a
.
Se ştie că pe parcursul modificărilor, cuvintele nu-şi schimbă numerele de ordine pe care le-au avut iniţial.
Cerinţă:
Scrieţi un program care să citească şirul de cuvinte şi să afişeze:
a) numărul de ordine al primului cuvânt şters sau valoarea 0
în cazul în care nu se şterge niciun cuvânt
Exemplu
cuvinte4.in
alfa faal alfa fala lafa afal calfa calfa!
cuvinte4.out
2 1 3 4 7 8
Explicație
Cuvintele obţinute prin transformarea cuvântului alfa
sunt: : lfaa
, faal
, aalf
. Prima pereche de cuvinte vecine care îndeplinesc cerinţele sunt cuvintele cu numerele de ordine 1
şi 2
. Va fi şters cuvântul cu numărul de ordine 2
. Şirul rezultat este format din următoarele 7
cuvinte: alfa alfa fala lafa afal calfa calfa
. Prima pereche care îndeplineşte cerinţele din noul şir este perechea formată din cuvintele fala
şi lafa
, având numerele de ordine 4
şi 5
, pentru că lista de cuvinte obţinute prin transformarea cuvântului fala
sunt: alaf
, lafa
, afal
. Se va şterge cuvântul cu numărul de ordine 5
. Şirul rezultat după ştergere este: alfa alfa fala afal calfa calfa
. Prima pereche care îndeplineşte cerinţele problemei în noul şir este fala
şi afal
. Se şterge afal
cu numărul de ordine 6
. Şirul rezultat după ştergere este: alfa alfa fala calfa calfa
. În acest şir nu se mai găseşte nicio pereche care să îndeplinească cerinţele. Au rămas deci cuvintele: alfa
, alfa
, fala
, calfa
, calfa
care au numerele de ordine 1
, 3
, 4
, 7
, 8
.
#include <bits/stdc++.h> using namespace std; ifstream cin("cuvinte4.in"); ofstream cout("cuvinte4.out"); char mat[26][11]; bool perm(char a[] , char b[]) { char x[11]; strcpy(x , a); int n = strlen(x); for(int i = 0 ; i < n - 1 ; ++i) { char aux = x[0]; for(int j = 0 ; j < strlen(x) - 1 ; ++j) x[j]=x[j+1]; x[strlen(x) - 1]=aux; if(strcmp(x , b) == 0) return 1; } return 0; } int main() { int n = 0; int vec[26]; while(cin >> mat[n]) vec[n] = n + 1 , n++; int d = strlen(mat[n-1]); mat[n-1][d-1]='\0'; int poz = 0; for(int i = 0 ; i < n - 1 ; ++i) { if(perm(mat[i] , mat[i+1])) { if(poz==0) poz = i+1; for(int j = i + 1 ; j < n - 1 ; ++j) { strcpy(mat[j] , mat[j+1]); vec[j]=vec[j+1]; } i--; n--; } } if(poz) cout << poz + 1 << endl; else cout << 0 << endl; for(int i = 0 ; i < n ; ++i) cout << vec[i] << ' '; return 0; }