Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- bool isDiag = false;
- vector<vector<string>> adj;
- vector<vector<string>> voi;
- //int pos[31];
- int encode(vector<string> chk){
- int ret = 0;
- int len = adj.size();
- for (int i = 0; i < chk.size(); i++)
- {
- vector<string> lis = adj[i];
- int ind = lower_bound(lis.begin(), lis.end(), chk[i]) - lis.begin();
- //int mul = pos[adj.size()-i - 1]; !!! cause invalid result for case 6, 10
- int mul = 1;
- for (int j = i + 1; j < len; j++)
- {
- mul *= adj[j].size();
- }
- ret += (ind * mul ) ;
- if(isDiag) cout << "check: "<< chk[i] << ", ind: " << ind << ", mul: " << mul << ", ret: " << ret << endl;
- }
- ret += 1;
- return ret;
- }
- string decode(int targ){
- string ret, coc;
- int len = adj.size();
- int remain = targ - 1;
- for (int i = 0; i < len; i++)
- {
- vector<string> lis = adj[i];
- //int mul = pos[len-i - 1]; !!! cause invalid result for case 6, 10
- int mul = 1;
- for (int j = i + 1; j < len; j++)
- {
- mul *= adj[j].size();
- }
- int ind = (remain / mul) ;
- ret += coc + lis[ind];
- coc = " ";
- if(isDiag) cout << "decode: "<< remain << ", ind: " << ind << ", mul: " << mul << ", ret: " << ret << endl;
- remain = remain % mul;
- }
- return ret;
- }
- int main(){
- //isDiag = true;
- if (isDiag)
- {
- freopen("nocow/6.in", "r", stdin);
- }else
- {
- freopen("nocow.in", "r", stdin);
- }
- int N, K; cin >> N >> K;
- string word;
- for (int i = 0; i < N; i++)
- {
- int no = 0;
- word = "";
- vector<string> liv ;
- while (word != "cow.")
- {
- no++;
- if (no > 5)
- {
- if (i == 0)
- {
- vector<string> lis;
- lis.push_back(word);
- adj.push_back(lis);
- }else
- {
- vector<string> &lis = adj[no - 6]; // !!!problem if not use pointer
- lis.push_back(word);
- }
- liv.push_back(word);
- //if(isDiag ) cout << word << " " ;
- }
- cin >> word;
- }
- voi.push_back(liv);
- //if(isDiag ) cout << endl;
- }
- //pos[0]= 1;
- for (int i = 0; i < adj.size(); i++)
- {
- vector<string> &lis = adj[i]; // !!!problem if not use pointer will cause search by lower_bound missing
- sort(lis.begin(), lis.end());
- lis.resize(unique(lis.begin(), lis.end()) - lis.begin());
- //pos[i+1] = pos[i] * lis.size(); !!! problem can't cal pos this way[top down] since will cause invalid result case 6, 10
- if (isDiag)
- {
- for (int j = 0; j < lis.size(); j++)
- {
- cout << lis[j] << " ";
- }
- cout << endl;
- }
- }
- //if (isDiag)
- //{
- //for (int i = 0; i < adj.size(); i++)
- //{
- //vector<string> lis = adj[i];
- //cout << "i: " << i << ", pos: " << pos[i+1] << ", list: " << lis.size()<< endl;
- //}
- //}
- //vector<string> chk;
- //chk.push_back("large");
- //chk.push_back("brown");
- //chk.push_back("noisy");
- //cout << encode(chk);
- //adj.push_back(adj[1] = "brown white spotted";
- //adj[2] = "noisy silent noisy";
- if(isDiag){
- vector<string> lis = adj[1];
- for (int i = 0; i < lis.size(); i++)
- {
- cout << "adj2 >> " << lis[i] << endl;
- }
- }
- for (int i = 0; i < voi.size(); i++)
- {
- int inx = encode(voi[i]);
- if (inx <= K)
- {
- K++;
- }
- //if(isDiag) cout << "void: "<< inx << endl;
- }
- if(!isDiag) freopen("nocow.out", "w", stdout);
- cout << decode(K) ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement