Advertisement
tepyotin2

Untitled

Jul 14th, 2023 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.26 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. bool isDiag = false;
  5. vector<vector<string>> adj;
  6. vector<vector<string>> voi;
  7. //int pos[31];
  8. int encode(vector<string> chk){
  9.     int ret = 0;
  10.     int len = adj.size();
  11.     for (int i = 0; i < chk.size(); i++)
  12.     {
  13.         vector<string> lis = adj[i];
  14.         int ind = lower_bound(lis.begin(), lis.end(), chk[i]) - lis.begin();
  15.         //int mul =  pos[adj.size()-i - 1]; !!! cause invalid result for case 6, 10
  16.         int mul = 1;
  17.         for (int j = i + 1; j < len; j++)
  18.         {
  19.             mul *= adj[j].size();
  20.         }
  21.         ret += (ind * mul ) ;
  22.         if(isDiag) cout << "check: "<< chk[i] << ", ind: " << ind << ", mul: " << mul << ", ret: " << ret << endl;
  23.     }
  24.     ret += 1;
  25.     return ret;
  26. }
  27. string decode(int targ){
  28.     string ret, coc;
  29.    
  30.     int len = adj.size();
  31.     int remain = targ - 1;
  32.     for (int i = 0; i < len; i++)
  33.     {
  34.         vector<string> lis = adj[i];
  35.         //int mul =  pos[len-i - 1]; !!! cause invalid result for case 6, 10
  36.         int mul = 1;
  37.         for (int j = i + 1; j < len; j++)
  38.         {
  39.             mul *= adj[j].size();
  40.         }
  41.        
  42.         int ind = (remain / mul) ;
  43.         ret += coc + lis[ind];
  44.         coc = " ";
  45.         if(isDiag) cout << "decode: "<< remain << ", ind: " << ind << ", mul: " << mul << ", ret: " << ret << endl;
  46.         remain = remain % mul;
  47.     }
  48.     return ret;
  49. }
  50. int main(){
  51.     //isDiag = true;
  52.     if (isDiag)
  53.     {
  54.         freopen("nocow/6.in", "r", stdin);
  55.     }else
  56.     {
  57.         freopen("nocow.in", "r", stdin);
  58.     }
  59.     int N, K; cin >> N >> K;
  60.    
  61.    
  62.     string word;
  63.    
  64.     for (int i = 0; i < N; i++)
  65.     {
  66.         int no = 0;
  67.         word = "";
  68.         vector<string> liv ;
  69.         while (word != "cow.")
  70.         {
  71.             no++;
  72.             if (no > 5)
  73.            
  74.             {
  75.                 if (i == 0)
  76.                 {
  77.                     vector<string> lis;
  78.                     lis.push_back(word);
  79.                     adj.push_back(lis);
  80.                 }else
  81.                 {
  82.                     vector<string> &lis = adj[no - 6]; // !!!problem if not use pointer
  83.                     lis.push_back(word);
  84.                 }
  85.                 liv.push_back(word);
  86.                
  87.                 //if(isDiag ) cout << word << " " ;
  88.             }
  89.             cin >> word;
  90.         }
  91.         voi.push_back(liv);
  92.         //if(isDiag ) cout << endl;
  93.     }
  94.     //pos[0]= 1;
  95.     for (int i = 0; i < adj.size(); i++)
  96.     {
  97.         vector<string> &lis = adj[i]; // !!!problem if not use pointer will cause search by lower_bound missing
  98.         sort(lis.begin(), lis.end());
  99.         lis.resize(unique(lis.begin(), lis.end()) - lis.begin());
  100.         //pos[i+1] = pos[i] * lis.size();   !!! problem can't cal pos this way[top down] since will cause invalid result case 6, 10
  101.         if (isDiag)
  102.         {
  103.             for (int j = 0; j < lis.size(); j++)
  104.             {
  105.                 cout << lis[j] << " ";
  106.             }
  107.             cout << endl;
  108.         }
  109.     }
  110.     //if (isDiag)
  111.     //{
  112.         //for (int i = 0; i < adj.size(); i++)
  113.         //{
  114.             //vector<string> lis = adj[i];
  115.             //cout << "i: " << i << ", pos: " << pos[i+1] << ", list: " << lis.size()<< endl;
  116.            
  117.         //}
  118.     //}
  119.    
  120.     //vector<string> chk;
  121.     //chk.push_back("large");
  122.     //chk.push_back("brown");
  123.     //chk.push_back("noisy");
  124.     //cout << encode(chk);
  125.     //adj.push_back(adj[1] = "brown white spotted";
  126.     //adj[2] = "noisy silent noisy";
  127.    
  128.     if(isDiag){
  129.         vector<string> lis = adj[1];
  130.         for (int i = 0; i < lis.size(); i++)
  131.         {
  132.             cout << "adj2 >> " << lis[i] << endl;
  133.         }
  134.        
  135.     }
  136.    
  137.     for (int i = 0; i < voi.size(); i++)
  138.     {
  139.         int inx = encode(voi[i]);
  140.         if (inx <= K)
  141.         {
  142.             K++;
  143.         }
  144.         //if(isDiag) cout << "void: "<< inx << endl;
  145.     }
  146.    
  147.     if(!isDiag) freopen("nocow.out", "w", stdout);
  148.    
  149.     cout << decode(K) ;
  150.    
  151.    
  152. }
  153.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement