Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.82 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <utility>
  7. #include <set>
  8. #include <map>
  9. #include <unordered_map>
  10. #include <cassert>
  11. #include <cmath>
  12. #include <ctime>
  13. #include <queue>
  14. #include <memory.h>
  15. #include <stack>
  16. #include <bitset>
  17.  
  18. using namespace std;
  19.  
  20. typedef long long ll;
  21. typedef long double ld;
  22.  
  23. vector < int > from_z_to_prefix(vector < int > z)
  24. {
  25.     int r = -1;
  26.     z[0] = 0;
  27.     vector < int > p(z.size());
  28.     for (int i = 0; i < z.size(); i++)
  29.     {
  30.         if (i + z[i] - 1 > r)
  31.         {
  32.             for (int pos = r + 1; pos <= i + z[i] - 1; pos++)
  33.             {
  34.                 p[pos] = pos - i + 1;
  35.             }
  36.             r = i + z[i] - 1;
  37.         }
  38.     }
  39.     return p;
  40. }
  41.  
  42. vector < int > from_prefix_to_z(vector < int > p)
  43. {
  44.     vector < int > z(p.size());
  45.     z[0] = p.size();
  46.     for (int i = 1; i < z.size(); i++)
  47.     {
  48.         if (p[i] != 0)
  49.         {
  50.             z[i - p[i] + 1] = max(p[i], z[i - p[i] + 1]);
  51.         }
  52.     }
  53.     int pos = 1;
  54.     while (pos < p.size())
  55.     {
  56.         int j;
  57.         for (j = pos + 1; j < pos + z[pos] && z[j] <= z[pos] - (j - pos) && z[j - pos] >= z[j]; j++)
  58.         {
  59.             z[j] = min(z[pos] - (j - pos), z[j - pos]);
  60.         }
  61.         pos = j;
  62.     }
  63.     return z;
  64. }
  65.  
  66. vector < int >  read_vector(int n)
  67. {
  68.     vector < int > v;
  69.     for (int i = 0; i < n; i++)
  70.     {
  71.         int x;
  72.         cin >> x;
  73.         v.push_back(x);
  74.     }
  75.     return v;
  76. }
  77.  
  78. void write_vector(vector < short > v)
  79. {
  80.     for (int el : v)
  81.     {
  82.         cout << el;
  83.     }
  84.     cout << "\n";
  85. }
  86.  
  87. struct Node
  88. {
  89.     int next[30];
  90.     //int last = 0;
  91. };
  92.  
  93. vector < int > last;
  94.  
  95. vector < int> prefix_function(string s)
  96. {
  97.     vector < int > p(s.size());
  98.     for (int i = 1; i < p.size(); i++)
  99.     {
  100.         int pos = p[i - 1];
  101.         while (pos > 0 && s[pos] != s[i])
  102.         {
  103.             pos = p[pos - 1];
  104.         }
  105.         s[i] == s[pos] ? p[i] = pos + 1 : p[i] = 0;
  106.     }
  107.     return p;
  108. }
  109.  
  110. vector < Node > build(string s)
  111. {
  112.     vector < Node > p(s.size() + 1);
  113.     last.resize(s.size() + 1);
  114.     vector < int > pref = prefix_function(s);
  115.     s = " " + s;
  116.     for (int i = 0; i < s.size() - 1; i++)
  117.     {
  118.         for (char c = 'a'; c <= 'z'; c++)
  119.         {
  120.             if (i > 0 && s[i + 1] != c)
  121.             {
  122.                 p[i].next[c - 'a'] = p[pref[i]].next[c - 'a'];
  123.                 last[p[pref[i]].next[c - 'a']] = max(last[p[pref[i]].next[c - 'a']], i);
  124.                 //p[p[pref[i]].next[c - 'a']].last = max(p[p[pref[i]].next[c - 'a']].last, i);
  125.                 continue;
  126.             }
  127.             if (s[i + 1] == c)
  128.             {
  129.                 p[i].next[c - 'a'] = i + 1;
  130.                 //p[i + 1].last = max(i, p[i + 1].last);
  131.                 continue;
  132.             }
  133.             p[i].next[c - 'a'] = i;
  134.             last[i] = max(i, last[i]);
  135.         }
  136.     }
  137.     return p;
  138. }
  139.  
  140. void norm(vector < short >& v)
  141. {
  142.     while (!v.empty() && v.back() == 0)
  143.     {
  144.         v.pop_back();
  145.         v.shrink_to_fit();
  146.     }
  147. }
  148.  
  149. vector < short > add(vector < short > v, vector < short > v1)
  150. {
  151.     v.resize(max(v.size(), v1.size()));
  152.     v1.resize(v.size());
  153.     int per = 0;
  154.     for (int i = 0; i < v.size(); i++)
  155.     {
  156.         v[i] += v1[i] + per;
  157.         if (v[i] >= 10)
  158.         {
  159.             v[i] -= 10;
  160.             per = 1;
  161.         }
  162.         else
  163.         {
  164.             per = 0;
  165.         }
  166.     }
  167.     if (per == 1)
  168.     {
  169.         v.push_back(1);
  170.     }
  171.     norm(v);
  172.     return v;
  173. }
  174.  
  175. void dec(vector < short >& v, vector < short > v1)
  176. {
  177.     v.resize(max(v.size(), v1.size()));
  178.     v1.resize(v.size());
  179.     int per = 0;
  180.     for (int i = v.size() - 1; i >= 0; i--)
  181.     {
  182.         if (v[i] - v1[i] - per >= 0)
  183.         {
  184.             v[i] -= v1[i] + per;
  185.             per = 0;
  186.         }
  187.         else
  188.         {
  189.             v[i] -= v1[i] + per;
  190.             v[i] += 10;
  191.             per = 1;
  192.         }
  193.     }
  194.     norm(v);
  195. }
  196.  
  197. vector < short > multiple(vector < short > v, short num)
  198. {
  199.     vector < short > v2 = { num % 10, num / 10 };
  200.     vector < short > ans(v.size() + 2);
  201.     for (int i = 0; i < v.size(); i++)
  202.     {
  203.         for (int j = 0; j < 2; j++)
  204.         {
  205.             ans[i + j] += v[i] * v2[j];
  206.         }
  207.     }
  208.     int per = 0;
  209.     for (int i = 0; i < ans.size(); i++)
  210.     {
  211.         ans[i] += per;
  212.         per = ans[i] / 10;
  213.         ans[i] %= 10;
  214.     }
  215.     norm(ans);
  216.     return ans;
  217. }
  218.  
  219.  
  220.  
  221. int main()
  222. {
  223.     freopen("input.txt", "r", stdin);
  224.     freopen("output.txt", "w", stdout);
  225.     ios_base::sync_with_stdio(false);
  226.     short n;
  227.     string s;
  228.     cin >> n >> s;
  229.     vector < Node > p = build(s);
  230.     vector < vector < short > > dp(30050);
  231.     dp[0] = { 0 };
  232.     for (int i = 1; i <= s.size(); i++)
  233.     {
  234.         dp[i] = { 0 };
  235.         dp[i] = multiple(add(dp[i - 1], { 1 }), n);
  236.         dp[i].shrink_to_fit();
  237.         //dp[i] = n * (dp[i - 1] + 1);
  238.         for (char c = 'a'; c <= 'z'; c++)
  239.         {
  240.             if (c != s[i - 1])
  241.             {
  242.                 dec(dp[i], dp[p[i - 1].next[c - 'a']]);
  243.                 //if (p[dp[p[i - 1]].next[c - 'a']].last == )
  244.                 //dp[i] -= dp[p[i - 1].next[c]];
  245.             }
  246.         }
  247.         for (char c = 'a'; c <= 'z'; c++)
  248.         {
  249.             if (c != s[i - 1])
  250.             {
  251.                 //dec(dp[i], dp[p[i - 1].next[c - 'a']]);
  252.                 if (last[p[i - 1].next[c - 'a']] <= i)
  253.                 {
  254.                     dp[p[i - 1].next[c - 'a']].clear();
  255.                     dp[p[i - 1].next[c - 'a']].shrink_to_fit();
  256.                 }
  257.                     //dp[i] -= dp[p[i - 1].next[c]];
  258.             }
  259.         }
  260.         dp[i].shrink_to_fit();
  261.     }
  262.     norm(dp[s.size()]);
  263.     reverse(dp[s.size()].begin(), dp[s.size()].end());
  264.     write_vector(dp[s.size()]);
  265.     //cout << dp[s.size()];
  266.     return 0;
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement