Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- // using namespace std; error: reference to 'pair' is ambiguous
- const int MAXW = 50257;
- const int MAXN = 1000000;
- typedef struct pair {
- int w1;// 0 <= w1 < MAXW
- int w2;// 0 <= w2 < MAXW
- bool operator == (pair b)
- {
- return w1 == b.w1 && w2 == b.w2;
- }
- bool operator < (pair b)
- {
- if(w1 != b.w1) return w1 < b.w1;
- return w2 < b.w2;
- }
- }pair;
- int mostLikely(int *V, int N, pair P)
- {
- int sol = 0, maxiAp = 0;
- int frecv[MAXW] = {0};
- for(int i = 2;i<N;i++)
- if(V[i-2] == P.w1 && V[i-1] == P.w2)
- {
- frecv[V[i]]++;
- if(frecv[V[i]] > maxiAp)
- sol = V[i], maxiAp = frecv[V[i]];
- }
- return sol;
- }
- int pairs(int *V, int N, pair *Pairs)
- {
- for(int i = 0;i < N - 1;i++)
- Pairs[i] = {V[i], V[i+1]};
- std::sort(Pairs, Pairs + N - 1);
- int L = 0;
- for(int i = 1;i < N - 1;i++)
- {
- if(! (Pairs[i] == Pairs[i-1]) )
- Pairs[++L] = Pairs[i];
- }
- return L + 1;
- }
- int pairIndex(pair *Pairs, int L, pair P)
- {
- int st = 0, dr = L - 1, mid;
- while(st <= dr)
- {
- mid = (st + dr) / 2;
- if(Pairs[mid] == P)
- return mid;
- if(Pairs[mid] < P)
- st = mid + 1;
- else dr = mid - 1;
- }
- return -1;
- }
- void learn(int *V, int N, pair *Pairs, int L, int *Next)
- {
- for(int i = 0;i < L;i++)
- Next[i] = mostLikely(V,N,Pairs[i]);
- }
- void generate(int *V, int N, int K, int *R, int X, int Y)
- {
- // Declaram si calculam Pairs si Next
- pair Pairs[N - 1];
- int L = pairs(V,N,Pairs);
- int Next[L];
- learn(V,N,Pairs,L,Next);
- // Generam textul.
- R[0] = X, R[1] = Y;
- for(int i = 2;i < K;i++)
- {
- pair c = {R[i-2], R[i-1]};
- int poz = pairIndex(Pairs,L,c);
- if(poz != -1)
- R[i] = Next[poz];
- else R[i] = 0;
- }
- }
- int main()
- {
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement