Advertisement
Guest User

bleh

a guest
Feb 17th, 2020
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.35 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #include <map>
  3. using namespace std;
  4.  
  5. struct state
  6. {
  7.     int len, link;
  8.     map<char, int> next;
  9. };
  10.  
  11. struct result
  12. {
  13.     int bestpos;
  14.     string match;
  15. };
  16.  
  17. const int MAXLEN = 100000;
  18. state st[MAXLEN * 2];
  19. int sz = 0, last;
  20.  
  21. string reverse_complement(string T)
  22. {
  23.     reverse(T.begin(), T.end());
  24.     for (int i = 0; i < T.length(); i++)
  25.     {
  26.         switch (T[i])
  27.         {
  28.         case 'A':
  29.             T[i] = 'T';
  30.             break;
  31.         case 'T':
  32.             T[i] = 'A';
  33.             break;
  34.         case 'G':
  35.             T[i] = 'C';
  36.             break;
  37.         case 'C':
  38.             T[i] = 'G';
  39.             break;
  40.         }
  41.     }
  42.  
  43.     return T;
  44. }
  45. void sa_init()
  46. {
  47.     st[0].len = 0;
  48.     st[0].link = -1;
  49.     cout << "sz: " << sz << endl;
  50.     sz++;
  51.     last = 0;
  52. }
  53.  
  54. void sa_extend(char c)
  55. {
  56.     int cur = sz++;
  57.     st[cur].len = st[last].len + 1;
  58.     int p = last;
  59.     while (p != -1 && !st[p].next.count(c))
  60.     {
  61.         st[p].next[c] = cur;
  62.         p = st[p].link;
  63.     }
  64.     if (p == -1)
  65.     {
  66.         st[cur].link = 0;
  67.     }
  68.     else
  69.     {
  70.         int q = st[p].next[c];
  71.         if (st[p].len + 1 == st[q].len)
  72.         {
  73.             st[cur].link = q;
  74.         }
  75.         else
  76.         {
  77.             int clone = sz++;
  78.             st[clone].len = st[p].len + 1;
  79.             st[clone].next = st[q].next;
  80.             st[clone].link = st[q].link;
  81.             while (p != -1 && st[p].next[c] == q)
  82.             {
  83.                 st[p].next[c] = clone;
  84.                 p = st[p].link;
  85.             }
  86.             st[q].link = st[cur].link = clone;
  87.         }
  88.     }
  89.     last = cur;
  90. }
  91.  
  92. result lcs(string S, string T)
  93. {
  94.     sa_init();
  95.     for (int i = 0; i < S.size(); i++)
  96.         sa_extend(S[i]);
  97.  
  98.     int v = 0, l = 0, best = 0, bestpos = 0;
  99.     for (int i = 0; i < T.size(); i++)
  100.     {
  101.         while (v && !st[v].next.count(T[i]))
  102.         {
  103.             v = st[v].link;
  104.             l = st[v].len;
  105.         }
  106.         if (st[v].next.count(T[i]))
  107.         {
  108.             v = st[v].next[T[i]];
  109.             l++;
  110.         }
  111.         if (l > best)
  112.         {
  113.             best = l;
  114.             bestpos = i;
  115.         }
  116.     }
  117.  
  118.     result res;
  119.     res.bestpos = bestpos - best + 1;
  120.     res.match = T.substr(bestpos - best + 1, best);
  121.     return res;
  122. }
  123.  
  124. int main()
  125. {
  126.     // your code goes here
  127.     string s = "ATCAACATCATAGCCAGATGCCCAGAGATTAGAGCGCATGACAAGTAAAGGACGGTTGTCAGCGTCATAAGAGGTTTTACCTCCAAATGAAGAAATAACATCATGGTAACGCTGCATGAAGTAATCACGTTCTTGGTCAGTATGCAAATTAGCATAAGCAGCTTGCAGACCCATAATGTCAATAGATGTGGTAGAAGTCGTCATTTGGCGAGAAAGCTCAGTCTCAGGAGGAAGCGGAGCAGTCCAAATG";
  128.     string t = "AGCGCCGTGGATGCCTGACCGTACCGAGGCTAACCCTAATGAGCTTAATCAAGATGATGCTCGTTATGGTTTCCGTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGCTTCCTCCTGAGACGGAGCTTTCTCGCCACATGACGACTTCTACCACATCTATTGACATTATGGGTCTGCAAGCTGCTTATGCTAATTTGCATACTGACCAAGAACGTGATTACTTCATGCAGCGTTACCATGCTGTAATT";
  129.     t = reverse_complement(t);
  130.     result res1 = lcs(s, t);
  131.     for (int i = 0; i < sz; i++)
  132.         st[i].next.clear();
  133.     result res2 = lcs(t, s);
  134.  
  135.     int headpos1 = res1.bestpos;
  136.     int headpos2 = res2.bestpos;
  137.     int endpos1 = headpos1 + res1.match.size();
  138.     int endpos2 = headpos2 + res2.match.size();
  139.     cout << res1.bestpos << "\n"
  140.          << res1.match << endl;
  141.     cout << res2.bestpos << "\n"
  142.          << res2.match << endl;
  143.  
  144.     return 0;
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement