Advertisement
shashwat2

Codechef - PETERSEN

Nov 23rd, 2014
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <set>
  4. #include <algorithm>
  5. #include <map>
  6. #include <queue>
  7. #include <string>
  8. #include <string.h>
  9.  
  10. #define PI pair<int,int>
  11. #define MP(a,b) make_pair(a,b)
  12.  
  13. #define MOD 1000000007
  14. #define long long ll
  15.  
  16. using namespace std;
  17.  
  18. int main()
  19. {
  20.     int t;
  21.     cin >> t;
  22.     while(t--)
  23.     {
  24.         string s;
  25.         cin >> s;
  26.         int n = s.length();
  27.         int a[n+1];
  28.         for(int i=0; i<n; i++) a[i+1] = s[i] - 'A';
  29.         int dp1[n+1], dp2[n+1];     // store prev (1-outer, 2-inner)
  30.        
  31. // dp1[i] = 1 means from (i-1)th to ith character, transition from outer to outer node is made
  32. // dp1[i] = 2 means from (i-1)th to ith character, transition from inner to outer node is made
  33. // dp2[i] = 1 means from (i-1)th to ith character, transition from outer to inner node is made
  34. // dp2[i] = 2 means from (i-1)th to ith character, transition from inner to inner node is made
  35.  
  36.         dp1[1] = 1;
  37.         dp2[1] = 1;
  38.         for(int i=2; i<=n; i++)
  39.         {
  40.             if(a[i] == a[i-1])
  41.             {
  42.                 if(dp2[i-1] != -1) dp1[i] = 2;      // outer to inner
  43.                 else dp1[i] = -1;
  44.                 if(dp1[i-1] != -1) dp2[i] = 1;      // inner to outer
  45.                 else dp2[i] = -1;
  46.             }
  47.             else
  48.             {
  49.                 // adj
  50.                 if(a[i] == (a[i-1]+1)%5 || a[i-1] == (a[i]+1)%5)
  51.                 {
  52.                     if(dp1[i-1] != -1) dp1[i] = 1;
  53.                 }
  54.                 else dp1[i] = -1;
  55.                 if(a[i] == (a[i-1]+2)%5 || a[i-1] == (a[i]+2)%5)
  56.                 {
  57.                     if(dp2[i-1] != -1) dp2[i] = 2;
  58.                 }
  59.                 else dp2[i] = -1;
  60.             }
  61.         }
  62.  
  63.         if(dp1[n]==-1 && dp2[n]==-1)
  64.         {
  65.             cout << -1 << endl;
  66.             return 0;
  67.         }
  68.         //~ for(int i=1; i<=n; i++) cout << dp1[i] << " "; cout << endl;
  69.         //~ for(int i=1; i<=n; i++) cout << dp2[i] << " "; cout << endl;
  70.        
  71.         vector<int> p1;
  72.         vector<int> p2;
  73.         int nn = 1;
  74.         for(int i=n; i>=1; i--)
  75.         {
  76.             if(nn==1 && dp1[i] != -1)
  77.             {
  78.                 p1.push_back(a[i]);     // outer node
  79.                 nn = dp1[i];
  80.             }
  81.             else if(nn==2 && dp2[i] != -1)
  82.             {
  83.                 p1.push_back(a[i]+5);   // inner node
  84.                 nn = dp2[i];
  85.             }
  86.         }
  87.        
  88.         nn = 2;
  89.         for(int i=n; i>=1; i--)
  90.         {
  91.             if(nn==1 && dp1[i] != -1)
  92.             {
  93.                 p2.push_back(a[i]);     // outer node
  94.                 nn = dp1[i];
  95.             }
  96.             else if(nn==2 && dp2[i] != -1)
  97.             {
  98.                 p2.push_back(a[i]+5);   // inner node
  99.                 nn = dp2[i];
  100.             }
  101.         }
  102.  
  103.         reverse(p1.begin(), p1.end());
  104.         reverse(p2.begin(), p2.end());
  105.         int s1 = p1.size();
  106.         int s2 = p2.size();
  107.         if(s2 < s1 || s2==s1 && p1[0] < p2[0])
  108.         {
  109.             if(s1==n) for(int i=0; i<s1; i++) cout << p1[i];
  110.             else cout << -1;
  111.         }
  112.         else if(s1 < s2 || s1==s2 && p2[0] < p1[0])
  113.         {
  114.             if(s2==n) for(int i=0; i<s2; i++) cout << p2[i];
  115.             else cout << -1;
  116.         }
  117.         cout << endl;
  118.     }
  119.     return 0;
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement