Sunday, December 1, 2019

[UVA] 13092 - Fold The String

Author            : Dipu Kumar Mohanto 
                    CSE, Batch - 6
                    BRUR.
Problem Statement : 13092 - Fold The String
Source            : UVA Online Judge
Category          : Data Structure, String
Algorithm         : Palindromic Tree
Verdict           : Accepted

  1. #include "bits/stdc++.h"  
  2.   
  3. using namespace std;  
  4.   
  5. static const int maxn = 3e6 + 10;  
  6.   
  7. struct Node  
  8. {  
  9.       int next[27];  
  10.       int len;  
  11.       int sufflink;  
  12.       int evenLen;  
  13.       Node(int len = 0, int sufflink = 0, int evenLen = 0)  
  14.             : len(len)  
  15.             , sufflink(sufflink)  
  16.             , evenLen(evenLen)  
  17.             {  
  18.                   memset(next, 0, sizeof next);  
  19.             }  
  20. } Tree[maxn];  
  21.   
  22. string s;  
  23. int len;  
  24. int num;  
  25. int suff;  
  26.   
  27. void init()  
  28. {  
  29.       for (int i = 0; i < maxn; i++) Tree[i] = Node();  
  30.       num = 2;  
  31.       suff = 2;  
  32.       Tree[1].len = -1; Tree[1].sufflink = 1; Tree[1].evenLen = 0;  
  33.       Tree[2].len = 0; Tree[2].sufflink = 1; Tree[2].evenLen = 0;  
  34. }  
  35.   
  36. bool addLetter(int pos)  
  37. {  
  38.       int cur = suff;  
  39.       int curlen = 0;  
  40.       int let = s[pos] - 'a';  
  41.       while (true)  
  42.       {  
  43.             curlen = Tree[cur].len;  
  44.             if (pos - 1 - curlen >= 0 and s[pos - 1 - curlen] == s[pos]) break;  
  45.             cur = Tree[cur].sufflink;  
  46.       }  
  47.       if (Tree[cur].next[let])  
  48.       {  
  49.             suff = Tree[cur].next[let];  
  50.             return false;  
  51.       }  
  52.       num++;  
  53.       suff = num;  
  54.       Tree[num].len = Tree[cur].len + 2;  
  55.       Tree[cur].next[let] = num;  
  56.       if (Tree[num].len % 2 == 0) Tree[num].evenLen = Tree[num].len;  
  57.       if (Tree[num].len == 1)  
  58.       {  
  59.             Tree[num].sufflink = 2;  
  60.             return true;  
  61.       }  
  62.       while (true)  
  63.       {  
  64.             cur = Tree[cur].sufflink;  
  65.             curlen = Tree[cur].len;  
  66.             if (pos - 1 - curlen >= 0 and s[pos - 1 - curlen] == s[pos])  
  67.             {  
  68.                   Tree[num].sufflink = Tree[cur].next[let];  
  69.                   break;  
  70.             }  
  71.       }  
  72.       if (Tree[num].len % 2 == 1) Tree[num].evenLen = Tree[ Tree[num].sufflink ].evenLen;  
  73.       return true;  
  74. }  
  75.   
  76. signed main()  
  77. {  
  78.       ios_base::sync_with_stdio(false);  
  79.       cin.tie(nullptr);  
  80.       cout.tie(nullptr);  
  81.   
  82.       #ifndef ONLINE_JUDGE  
  83.             freopen("in.txt""r", stdin);  
  84.       #endif // ONLINE_JUDGE  
  85.   
  86.       int tc;  
  87.       cin >> tc;  
  88.       for (int tcase = 1; tcase <= tc; tcase++)  
  89.       {  
  90.             int x, y;  
  91.             cin >> x >> y >> s;  
  92.             len = s.size();  
  93.             init();  
  94.             vector <int> evenLen(len);  
  95.             for (int i = 0; i < len; i++)  
  96.             {  
  97.                   addLetter(i);  
  98.                   evenLen[i] = Tree[suff].evenLen;  
  99.             }  
  100.             long long cost = 0;  
  101.             for (int i = len - 1; i >= 0; i--)  
  102.             {  
  103.                   if (evenLen[i] > 0)  
  104.                   {  
  105.                         int h = evenLen[i] / 2;  
  106.                         if (h * x > y)  
  107.                         {  
  108.                               cost += y;  
  109.                               i = i - h + 1;  
  110.                         }  
  111.                         else  
  112.                         {  
  113.                               cost += x;  
  114.                         }  
  115.                   }  
  116.                   else  
  117.                   {  
  118.                         cost += x;  
  119.                   }  
  120.             }  
  121.             cout << "Case " << tcase << ": " << cost << '\n';  
  122.       }  
  123. }  

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.