Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.94 KB | None | 0 0
  1. #include <fstream>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. #define nmax 701
  6. using namespace std;
  7. ifstream fin("p.in");
  8. ofstream fout("p.out");
  9.  
  10. struct info_stare ///se pastreaza vectorul de stari in care ajunge o anumita stare
  11. {
  12. int nr = 0;
  13. int v_end[nmax];
  14. };
  15.  
  16. struct stare {
  17. int valoare;
  18. int valoare_codif;
  19. };
  20.  
  21. info_stare fc_tranz[nmax][nmax]; ///functia de tranzitie
  22. stare st[nmax]; ///vectorul de stari
  23. char alfabet[nmax]; ///alfabetul
  24. int st_fin[nmax]; ///vectorul de stari finale
  25.  
  26. int nr_stari, nr_litere, stare_initiala, nr_stari_finale, nr_tranzitii;
  27. int propr;
  28. void read() {
  29. ///CITIM STARILE SI LE CODIFICAM
  30. int i;
  31. fin >> nr_stari;
  32. for (i = 0; i < nr_stari; i++) {
  33. fin >> st[i].valoare;
  34. st[i].valoare_codif = i;
  35.  
  36. }
  37. ///CITIM ALFABETUL
  38. fin >> nr_litere;
  39. for (i = 0; i < nr_litere; i++)
  40. fin >> alfabet[i];
  41.  
  42. ///CITIM STAREA INITIALA SI O CODIFICAM
  43. int val_in;
  44. fin >> val_in;
  45. for (i = 0; i < nr_stari; i++)
  46. if (val_in == st[i].valoare) stare_initiala = st[i].valoare_codif;
  47.  
  48. ///CITIM VECTORUL DE STARI FINALE SI IL CODIFICAM
  49. fin >> nr_stari_finale;
  50. for (i = 0; i < nr_stari_finale; i++) {
  51. int val;
  52. fin >> val;
  53. int j;
  54. for (j = 0; j < nr_stari; j++)
  55. if (val == st[j].valoare) st_fin[i] = st[j].valoare_codif;
  56. }
  57.  
  58. ///REALIZAM FUNCTIA DE TRANZITIE
  59. fin >> nr_tranzitii;
  60. for (i = 0; i < nr_tranzitii; i++) {
  61. int stare1, stare2;
  62. char litera;
  63. fin >> stare1 >> litera >> stare2;
  64. int stare1_codif, stare2_codif;
  65. ///CALCULAM CODIFICARILE STARILOR
  66. int j;
  67. for (j = 0; j < nr_stari; j++) {
  68. if (stare1 == st[j].valoare) stare1_codif = st[j].valoare_codif;
  69. if (stare2 == st[j].valoare) stare2_codif = st[j].valoare_codif;
  70. }
  71. ///INTRODUCEM IN FC DE TRANZITIE DATELE
  72. if (litera != '.') {
  73. int ct = fc_tranz[stare1_codif][int(litera - 'a')].nr;
  74. fc_tranz[stare1_codif][int(litera - 'a')].v_end[ct] = stare2_codif;
  75. ct++;
  76. fc_tranz[stare1_codif][int(litera - 'a')].nr = ct;
  77. } else ///CAZ SPECIAL PT LAMBDA,CARE INTRA PE COLOANA 26
  78. {
  79. int ct = fc_tranz[stare1_codif][26].nr;
  80. fc_tranz[stare1_codif][26].v_end[ct] = stare2_codif;
  81. ct++;
  82. fc_tranz[stare1_codif][26].nr = ct;
  83. }
  84. }
  85. }
  86.  
  87. ///CALULAM LAMBDA-CLOSURE
  88. struct st_lambda {
  89. int num = 0;
  90. int vec[nmax];
  91. };
  92.  
  93. st_lambda l_clos[nmax];
  94.  
  95. void calc_lambda_cosure(int stare) {
  96. int ct = fc_tranz[stare][26].nr;
  97. for (int i = 0; i < ct; i++) {
  98. l_clos[stare].vec[l_clos[stare].num] = fc_tranz[stare][26].v_end[i];
  99. l_clos[stare].num++;
  100. calc_lambda_cosure(fc_tranz[stare][26].v_end[i]);
  101. }
  102. }
  103.  
  104. ///FUNCTIE CARE VERIFICA DACA O STARE stare AJUNGE INTR-O STARE FINALA PRIN INTERMEDIUL LITEREI ch
  105. bool delta(int stare, char ch) {
  106. int ct = fc_tranz[stare][int(ch - 'a')].nr;
  107. int pp = 0;
  108. for (int i = 0; i < ct; i++) {
  109. pp = 0;
  110. int j;
  111. int val = fc_tranz[stare][int(ch - 'a')].v_end[i];
  112. for (j = 0; j < nr_stari_finale; j++)
  113. if (val == st_fin[j]) {
  114. pp = 1;
  115. return 1;
  116. }
  117. if (!pp) {
  118. int ct2 = l_clos[val].num;
  119. for (j = 0; j < ct; j++) {
  120. int k;
  121. for (k = 0; k < nr_stari_finale; k++)
  122. if (l_clos[val].vec[j] == st_fin[k]) return 1;
  123. }
  124. }
  125.  
  126. }
  127.  
  128. return 0;
  129. }
  130.  
  131. struct pereche {
  132. int str;
  133. char cuv[nmax];
  134. };
  135.  
  136. void delta_tilda(int st_in, char s[]) {
  137. queue < pereche > C;
  138. pereche per;
  139. per.str = st_in;
  140. strcpy(per.cuv, s);
  141. C.push(per);
  142.  
  143. while (!C.empty()) {
  144. per = C.front();
  145. //fout << per.str << " " << per.cuv << " ";
  146. if (strlen(per.cuv) == 1) {
  147. if (delta(per.str, per.cuv[0]) == 1) {
  148. propr = 1;
  149. return;
  150. }
  151. C.pop();
  152. }
  153. else {
  154. C.pop();
  155. int st = per.str;
  156. char ch = per.cuv[0];
  157. int ct = fc_tranz[st][int(ch - 'a')].nr;
  158. //fout << ct << "\n";
  159. int i;
  160. char sir[nmax];
  161. strcpy(sir, per.cuv);
  162. for (i = 0; i < ct; i++) {
  163. int val = fc_tranz[st][int(ch - 'a')].v_end[i];
  164. pereche pr2;
  165. pr2.str = val;
  166. strcpy(pr2.cuv, sir + 1);
  167. C.push(pr2);
  168. }
  169. if (ct == 0) ///DACA NU PLEACA LITERA POTRIVITA VOM MERGE MAI DEPARTE CU LAMBDA
  170. {
  171. int ct2 = fc_tranz[st][26].nr;
  172. for (i = 0; i < ct2; i++) {
  173. int val2 = fc_tranz[st][26].v_end[i];
  174. pereche pr2;
  175. pr2.str = val2;
  176. strcpy(pr2.cuv, sir);
  177. C.push(pr2);
  178. }
  179. }
  180. }
  181. }
  182. }
  183.  
  184. int main() {
  185. read();
  186. int i, j;
  187. for (j = 0; j < nr_stari; j++) ///calculam lambda-cosure pt fiecare nod
  188. calc_lambda_cosure(j);
  189.  
  190. int numar;
  191. fin >> numar;
  192. char str[nmax];
  193.  
  194. for (i = 0; i < numar; i++) {
  195. propr = 0;
  196. fin >> str;
  197. delta_tilda(stare_initiala, str);
  198. if (propr == 0) fout << "NU";
  199. else fout << "DA";
  200. fout << "\n";
  201.  
  202. }
  203.  
  204. return 0;
  205. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement