Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2019
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.26 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <map>
  5. #include <stack>
  6. #include <vector>
  7. #include <algorithm>
  8.  
  9. #define MAX 30
  10. #define mapii map <int, int>
  11. #define mp make_pair
  12. #define pb push_back
  13.  
  14. using namespace std;
  15.  
  16. mapii g[MAX];
  17. vector <string> ans;
  18. int nin[MAX], len;
  19. bool vis[MAX], use[MAX];
  20.  
  21. void build()
  22. {
  23.   int i;
  24.   char l1,l2,l3,l4;
  25.  
  26.   for ( i = 0; i < MAX; i++) {
  27.     g[i].clear();
  28.   }
  29.  
  30.   memset(nin, 0, sizeof(nin));
  31.  
  32.   scanf("%c%c%c%c", &l1, &l2, &l3, &l4);
  33.   while(l4 != '\n')
  34.   {
  35.     g[l1-'A'].insert(mp(l3-'A', 0));
  36.     nin[l3-'A']++;
  37.     scanf("%c%c%c%c", &l1, &l2, &l3, &l4);
  38.   }
  39.  
  40.   g[l1-'A'].insert(mp(l3-'A', 0));
  41.   nin[l3-'A']++;
  42.  
  43. }
  44.  
  45. void topoSort(string s)
  46. {
  47.   int i;
  48.   mapii::iterator mit;
  49.  
  50.   for ( i = 0; i < 27; i++) {
  51.     if(use[i] && nin[i] == 0 && !vis[i])
  52.     {
  53.       vis[i] = 1;
  54.       s.pb((char)i+'A');
  55.  
  56.       for ( mit = g[i].begin(); mit != g[i].end(); mit++) {
  57.         nin[mit->first]--;
  58.       }
  59.  
  60.       topoSort(s);
  61.  
  62.       vis[i] = 0;
  63.       s.pop_back();
  64.  
  65.       for ( mit = g[i].begin(); mit != g[i].end(); mit++) {
  66.         nin[mit->first]++;
  67.       }
  68.     }
  69.   }
  70.    
  71.   if(s.size()-1 == len)
  72.     ans.pb(s);
  73. }
  74.  
  75. int main() {
  76.   int i, j, sz, T;
  77.   char l1,l2;
  78.   string s;
  79.   mapii::iterator mit;
  80.   scanf("%d ", &T);
  81.  
  82.   while (T--) {
  83.    
  84.     memset(use, 0, sizeof(use));
  85.     len = 0;
  86.     scanf("%c%c", &l1, &l2);
  87.     while(l2 != '\n')
  88.     {
  89.       use[l1-'A'] = 1;
  90.       scanf("%c%c", &l1, &l2);
  91.       len++;
  92.     }
  93.     use[l1-'A'] = 1;
  94.    
  95.     build();
  96.     /*for ( i = 0; i < 27; i++) {
  97.       printf("%c[%d]: ", i+'A', nin[i]);
  98.       for ( mit = g[i].begin(); mit != g[i].end(); mit++) {
  99.         printf("%c ", mit->first+'A');
  100.       }
  101.       printf("\n");
  102.  
  103.     }*/
  104.     memset(vis, 0, sizeof(vis));
  105.     s.clear();
  106.     ans.clear();
  107.     topoSort(s);
  108.  
  109.     sort(ans.begin(),ans.end());
  110.  
  111.     if(!ans.empty())
  112.     {
  113.       for ( i = 0; i < (int)ans.size(); i++) {
  114.         s = ans[i];
  115.         sz = s.size();
  116.         for ( j = 0; j < sz; j++) {
  117.           if(j != sz-1)
  118.             printf("%c ", s[j]);
  119.           else
  120.             printf("%c\n", s[j]);
  121.         }
  122.       }
  123.     }
  124.     else
  125.       printf("NO\n");
  126.  
  127.     if(T>=1)
  128.       printf("\n");
  129.  
  130.     scanf("\n");
  131.   }
  132.   return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement