Advertisement
Guest User

Untitled

a guest
Oct 15th, 2019
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <cstring>
  4. #include <fstream>
  5. #include <set>
  6. #include <array>
  7. #include "json.hpp"
  8.  
  9. using namespace std;
  10. using json = nlohmann::json;
  11.  
  12. const int MAXWORDN = 400;
  13.  
  14. enum State {UNKNOWN, WIN, LOSE};
  15.  
  16. map<string, size_t> wordmap;
  17. vector<string> wordlist;
  18. array<array<set<size_t>, MAXWORDN>, MAXWORDN> adj;
  19. vector<string> idllist;
  20. map<string, size_t> idlmap;
  21. vector<size_t> firstword;
  22. vector<size_t> lastword;
  23. //array<int, MAXWORDN> in;
  24. //array<int, MAXWORDN> out;
  25. array<State, MAXWORDN> state; //0: unknown, 1: win on first hand, 2: lose on first hand
  26. int n;  //num of word
  27.  
  28. void update_state(){
  29.     state.fill((State)(0));
  30.     while(true){
  31.         bool flag = false;
  32.         for(int i = 0; i < n; i++){
  33.             if(state[i] != UNKNOWN){
  34.                 continue;
  35.             }
  36.             State s = LOSE;
  37.             for(int j = 0; j < n; j++){
  38.                 if(!adj[i][j].empty()){
  39.                     if(state[j] == LOSE){
  40.                         s = WIN;
  41.                         break;
  42.                     }
  43.                     if(state[j] == UNKNOWN && s == LOSE){
  44.                         s = UNKNOWN;
  45.                     }
  46.                 }
  47.             }
  48.             if(state[i] != s){
  49.                 state[i] = s;
  50.                 flag = true;
  51.             }
  52.         }
  53.         if(!flag){
  54.             break;
  55.         }
  56.     }
  57. }
  58.  
  59. void count_edge(){
  60.     size_t sum = 0;
  61.     for(int i=0;i<n;i++){
  62.         for(int j=0;j<n;j++){
  63.             sum += adj[i][j].size();
  64.         }
  65.     }
  66.     cout << sum <<endl;
  67. }
  68.  
  69. void rmidl(size_t i){
  70.     count_edge();
  71.     size_t f = firstword[i];
  72.     size_t l = lastword[i];
  73.     adj[f][l].erase(i);
  74.     update_state();
  75.     count_edge();
  76. }
  77.  
  78. size_t decision(string str){
  79.     rmidl(idlmap[str]);
  80.     size_t now = lastword[idlmap[str]];
  81.     if(state[now] == WIN){
  82.         for(int i = 0; i < n; i++){
  83.             if(state[i] == LOSE && !adj[now][i].empty()){
  84.                 size_t ans = *adj[now][i].begin();
  85.                 rmidl(ans);
  86.                 return ans;
  87.             }
  88.         }
  89.     }
  90.     else if(state[now] == UNKNOWN){
  91.         for(int i = 0; i < n; i++){
  92.             if(state[i] == UNKNOWN && !adj[now][i].empty()){
  93.                 size_t ans = *adj[now][i].begin();
  94.                 rmidl(ans);
  95.                 return ans;
  96.             }
  97.         }
  98.     }
  99.     else{
  100.         for(int i = 0; i < n; i++){
  101.             if(!adj[now][i].empty()){
  102.                 size_t ans = *adj[now][i].begin();
  103.                 rmidl(ans);
  104.                 return ans;
  105.             }
  106.         }
  107.     }
  108.     return 0;
  109. }
  110.  
  111.  
  112. int main()
  113. {
  114.  
  115.     std::ifstream fin("idl.json");
  116.     json j;
  117.     fin >> j;
  118.  
  119.     for(auto& [key, value] : j.items()){
  120.         idllist.push_back(key);
  121.         string first = value["first"];
  122.         string last = value["last"];
  123.         if(wordmap.find(first) == wordmap.end()){
  124.             int idx = wordmap.size();
  125.             wordmap[first] = idx;
  126.             wordlist.push_back(first);
  127.         }
  128.         if(wordmap.find(last) == wordmap.end()){
  129.             int idx = wordmap.size();
  130.             wordmap[last] = idx;
  131.             wordlist.push_back(last);
  132.         }
  133.         size_t idx = idllist.size() - 1;
  134.         size_t f = wordmap[first];
  135.         size_t l = wordmap[last];
  136.         adj[f][l].insert(idx);
  137.         //in[l] ++;
  138.         //out[f] ++;
  139.         firstword.push_back(f);
  140.         lastword.push_back(l);
  141.         idlmap[key] = idx;
  142.         cout << key << " " << first << " " << last << endl;
  143.         cout << idllist[idx] << " " << firstword[idx] << " " << lastword[idx] << endl;
  144.         break;
  145.     }
  146.  
  147.     n = wordlist.size();
  148.  
  149.     string str;
  150.     cin >> str;
  151.     while(true){
  152.         str = idllist[decision(str)];
  153.         cout << str << endl;
  154.     }
  155.  
  156.     return 0;
  157. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement