Hezov

UAIC 2024 SIII P3

Jul 2nd, 2025 (edited)
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. // using namespace std;   error: reference to 'pair' is ambiguous
  4. const int MAXW = 50257;
  5. const int MAXN = 1000000;
  6. typedef struct pair {
  7.     int w1;// 0 <= w1 < MAXW
  8.     int w2;// 0 <= w2 < MAXW
  9.     bool operator == (pair b)
  10.     {
  11.         return (w1 == b.w1 && w2 == b.w2);
  12.     }
  13.     bool operator < (pair b)
  14.     {
  15.         if(w1 != b.w1)
  16.             return (w1 < b.w1);
  17.         return (w2 < b.w2);
  18.     }
  19. }pair;
  20.  
  21. int mostLikely(int *V, int N, pair P)
  22. {
  23.     int sol = 0, maxiAp = 0;
  24.     int frecv[MAXW] = {0};
  25.     for(int i = 2;i<N;i++)
  26.         if(V[i-2] == P.w1 && V[i-1] == P.w2)
  27.         {
  28.             frecv[V[i]]++;
  29.             if(frecv[V[i]] > maxiAp)
  30.                 sol = V[i], maxiAp = frecv[V[i]];
  31.         }
  32.     return sol;
  33. }
  34. bool cmp(pair a, pair b)
  35. {
  36.     if(a.w1 != b.w1)
  37.         return a.w1 < b.w1;
  38.     return a.w2 < b.w2;
  39. }
  40. int pairs(int *V, int N, pair *Pairs)
  41. {
  42.     for(int i = 0;i < N - 1;i++)
  43.         Pairs[i] = {V[i], V[i+1]};
  44.  
  45.     std::sort(Pairs, Pairs + N - 1, cmp);
  46.  
  47.     int L = 0;
  48.  
  49.     for(int i = 1;i < N - 1;i++)
  50.     {
  51.         if(! (Pairs[i] == Pairs[i-1]) )
  52.             Pairs[++L] = Pairs[i];
  53.     }
  54.     return L + 1;
  55. }
  56. int pairIndex(pair *Pairs, int L, pair P)
  57. {
  58.     int st = 0, dr = L - 1, mid;
  59.     while(st <= dr)
  60.     {
  61.         mid = (st + dr) / 2;
  62.         if(Pairs[mid] == P)
  63.             return mid;
  64.         if(Pairs[mid] < P)
  65.             st = mid + 1;
  66.         else dr = mid - 1;
  67.     }
  68.     return -1;
  69. }
  70. void learn(int *V, int N, pair *Pairs, int L, int *Next)
  71. {
  72.     for(int i = 0;i < L;i++)
  73.         Next[i] = mostLikely(V,N,Pairs[i]);
  74. }
  75. void generate(int *V, int N, int K, int *R, int X, int Y)
  76. {
  77.     // Declaram si calculam Pairs si Next
  78.     pair Pairs[N - 1];
  79.     int L = pairs(V,N,Pairs);
  80.     int Next[L];
  81.     learn(V,N,Pairs,L,Next);
  82.  
  83.     // Generam textul.
  84.     R[0] = X, R[1] = Y;
  85.     for(int i = 2;i < K;i++)
  86.     {
  87.         pair c = {R[i-2], R[i-1]};
  88.         int poz = pairIndex(Pairs,L,c);
  89.         if(poz != -1)
  90.             R[i] = Next[poz];
  91.         else R[i] = 0;
  92.     }
  93. }
  94. int main()
  95. {
  96.     return 0;
  97. }
  98.  
Advertisement
Add Comment
Please, Sign In to add comment