Advertisement
a53

Logic1

a53
Dec 4th, 2021
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.99 KB | None | 0 0
  1. #include <stdio.h>
  2. # include <string.h>
  3.  
  4. # define _fin "logic.in"
  5. # define _fout "logic.out"
  6.  
  7. # define maxs 512 // lungimea maxima
  8. # define maxv 20 // numarul de variabile
  9. # define sigma 26 // literele mici ale alfabetului englez
  10.  
  11.  
  12. char e1[maxs], e2[maxs];
  13. int var[maxv], nv, vv[sigma], l1, l2;
  14. int ec=1, poz;
  15.  
  16. /// var[i] = xi; => xi+'a' este simbolul variabilei i
  17. /// nv = numarul de variabile,
  18. /// vv = valoarea fiecarei variabile existente
  19.  
  20.  
  21. void readf(FILE *fin)
  22. {
  23. int i;
  24. int aux[maxs];
  25.  
  26. # define rem_endl(a) ( a[strlen(a)-1] = '\0' )
  27.  
  28. fgets(e1, maxs, fin), rem_endl(e1);
  29. fgets(e2, maxs, fin), rem_endl(e2);
  30.  
  31. # undef rem_endl
  32.  
  33. for(i=0; i<strlen(e1); i++)
  34. if ( e1[i] == ' ' )
  35. memmove( e1+i, e1+i+1, sizeof(int) * ( strlen(e1)-i ) ),
  36. --i;
  37.  
  38. for(i=0; i<strlen(e2); i++)
  39. if ( e2[i] == ' ' )
  40. memmove( e2+i, e2+i+1, sizeof(int) * ( strlen(e2)-i ) ),
  41. --i;
  42. }
  43.  
  44. void writef(FILE *fout)
  45. {
  46. fprintf(fout, "%s\n", ec==1 ? "egale" : "diferite" );
  47. }
  48.  
  49. # define isalpha(x) ( (x) >= 'a' && (x) <= 'z' )
  50.  
  51. void pre_compute()
  52. {
  53. int i;
  54. memset(vv, 0, sizeof(vv));
  55. memset(var, 0, sizeof(var));
  56. nv = poz = 0;
  57. ec = 1;
  58.  
  59. l1 = strlen(e1), l2 = strlen(e2);
  60.  
  61. for(i=0; i<l1; i++)
  62. if ( isalpha( e1[i] ) && ! vv[ e1[i] - 'a' ])
  63. ++vv[ var[ ++nv ] = e1[i] - 'a' ];
  64.  
  65. for(i=0; i<l2; i++)
  66. if ( isalpha( e2[i] ) && vv[ e2[i] - 'a' ] & 1 )
  67. ++vv[ e2[i] - 'a' ];
  68.  
  69. for(i=0; i<sigma; i++) if ( vv[i] & 1 ) ec = 0;
  70. // daca o variabila nu se gaseste in ambele expresii
  71. // cele doua nu sunt echivalente
  72.  
  73. memset(vv, 0, sizeof(vv));
  74. }
  75.  
  76. inline int getlvalue(char ch) // valoarea logica a variabilei ch | nu
  77. // se verifica existenta acesteia
  78. {
  79. return ( vv[ ch - 'a' ] );
  80. }
  81.  
  82. inline int variable(const char e[])
  83. {
  84. if ( e[poz] == '~' )
  85. {
  86. ++poz;
  87. return ( !variable(e) );
  88. }
  89. else
  90. return ( getlvalue( e[ poz++ ] ) );
  91. }
  92.  
  93. int evaluate(const char e[], int l);
  94.  
  95. int log_and(const char e[], int l)
  96. { // evaluez o secventa care contine or sau xor
  97. int v, neg=0;
  98.  
  99. while ( e[poz] == '~' && poz < l )
  100. {
  101. ++poz, neg = !neg;
  102. }
  103.  
  104. if ( e[poz] == '(' )
  105. {
  106. ++poz; // (
  107. v = evaluate( e, l );
  108. if ( e[poz] != ')' )
  109. ec = -1;
  110. // nu ar trebui sa se intample daca expresia este corecta
  111. ++poz; // )
  112. }
  113. else
  114. v = variable( e ); // valoarea primei variabile
  115.  
  116. if ( neg ) v = !v; // negam NUMAI prima valoare
  117.  
  118. while ( e[ poz ] == '&' && poz < l ) // AND are cea mai mare prioritate
  119. ++poz, v &= log_and( e, l );
  120.  
  121. return v;
  122. }
  123.  
  124. int evaluate(const char e[], int l)
  125. {
  126. // XOR, OR
  127. int v = log_and( e, l );
  128.  
  129. while ( e[ poz ] == '|' || e[ poz ] == '^' && poz < l )
  130. if ( e[ poz ] == '|' )
  131. ++poz, v |= evaluate( e, l );
  132. else
  133. ++poz, v ^= evaluate( e, l );
  134.  
  135. return v;
  136. }
  137.  
  138. void solve()
  139. {
  140. int max, i, j, vi; // valoarea initiala
  141.  
  142. max = ( 1 << nv ) - 1; // 111...1 de nv ori
  143.  
  144. # define getbit(a, bit) ( ( (a) >> (bit) ) & 1 )
  145.  
  146. // evaluam cele doua expresii cand toate variabilele sunt setate false
  147. vi = evaluate(e1, l1), poz = 0;
  148. if ( evaluate(e2, l2) != vi ) ec = 0;
  149.  
  150. for(i=1; i<=max && ec==1; i++)
  151. {
  152. for(j=0; j<nv; j++)
  153. vv[ var[j+1] ] = getbit(i, j);
  154.  
  155. poz = 0, vi = evaluate(e1, l1);
  156. poz = 0;
  157. if ( vi != evaluate(e2, l2) )
  158. {
  159. ec = 0, poz = 0;
  160. evaluate(e2, l2);
  161. }
  162. }
  163. }
  164.  
  165. int main()
  166. {
  167. int t;
  168. FILE *fin = fopen(_fin, "r");
  169. FILE *fout= fopen(_fout,"w");
  170.  
  171. for(fscanf(fin, "%d\n", &t); t; --t)
  172. {
  173. readf(fin);
  174. pre_compute();
  175. solve();
  176. writef(fout);
  177. }
  178.  
  179. fclose(fin);
  180. fclose(fout);
  181.  
  182. return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement