Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <string>
  6. #include <vector>
  7. #include <set>
  8. #include <map>
  9. #include <utility>
  10. #include <cstdlib>
  11. #include <memory>
  12. #include <queue>
  13. #include <cassert>
  14. #include <cmath>
  15. #include <ctime>
  16. #include <complex>
  17. #include <bitset>
  18. #include <fstream>
  19. #include <unordered_map>
  20. #include <unordered_set>
  21. #include <numeric>
  22.  
  23. using namespace std;
  24.  
  25. #define ws ws_____________________
  26. #define y1 y1_____________________
  27. #define y0 y0_____________________
  28. #define left left_________________
  29. #define right right_______________
  30. #define next next_________________
  31. #define prev prev_________________
  32. #define hash hash_________________
  33.  
  34. #define pb push_back
  35. #define fst first
  36. #define snd second
  37. #define mp make_pair
  38. #define sz(C) ((int) (C).size())
  39. #define forn(i, n) for (int i = 0; i < int(n); ++i)
  40. #define ford(i, n) for (int i = int(n) - 1; i >= 0; --i)
  41. #define all(C) begin(C), end(C)
  42.  
  43. typedef long long ll;
  44. typedef unsigned long long ull;
  45. typedef unsigned int uint;
  46. typedef pair<int,int> pii;
  47. typedef pair<ll, ll> pll;
  48. typedef vector<ll> vll;
  49. typedef vector<int> vi;
  50. typedef vector<vi> vvi;
  51. typedef vector<pii> vii;
  52. typedef long double ld;
  53. typedef complex<double> cd;
  54.  
  55. #define FILE_NAME "a"
  56.  
  57. const int MAXN = 5000 + 10;
  58. const int MOD = 1e9 + 7;
  59. const int A = 26;
  60.  
  61. void add(int& x, int y) {
  62.     ((x += y) >= MOD) && (x -= MOD);
  63. }
  64.  
  65. int mul(int x, int y) {
  66.     return x * 1ll * y % MOD;
  67. }
  68.  
  69. int n;
  70. char s[MAXN];
  71.  
  72. bool read() {
  73.     if  (scanf("%d\n", &n) < 1) {
  74.         return 0;
  75.     }
  76.     scanf("%s", s);
  77.     return 1;
  78. }
  79.  
  80. int last[A][MAXN];
  81. vii segs;
  82.  
  83. int fact[MAXN];
  84. int inv_fact[MAXN];
  85.  
  86. int mpow(int a, int p) {
  87.     int res = 1;
  88.     for (; p > 0; p >>= 1, a = mul(a, a)) {
  89.         if  (p & 1) {
  90.             res = mul(res, a);
  91.         }
  92.     }
  93.     return res;
  94. }
  95.  
  96. void precalc() {
  97.     segs.clear();
  98.     for (int i = 0, j = 0; i < n; i = j) {
  99.         while (j < n && s[i] == s[j]) {
  100.             ++j;
  101.         }
  102.         segs.pb(mp(i, j - 1));
  103.     }
  104.  
  105.     fact[0] = 1;
  106.     for (int i = 1; i < MAXN; ++i) {
  107.         fact[i] = mul(fact[i - 1], i);
  108.     }
  109.  
  110.     forn(i, MAXN) {
  111.         inv_fact[i] = mpow(fact[i], MOD - 2);
  112.     }
  113. }
  114.  
  115. int C(int n, int k) {
  116.     return mul(fact[n], mul(inv_fact[n - k], inv_fact[k]));
  117. }
  118.  
  119. int CC(int n, int k) {
  120.     return C(n + k - 1, k);
  121. }
  122.  
  123. int dp[MAXN][MAXN];
  124.  
  125. int solve() {
  126.     precalc();
  127.  
  128.     for (auto s : segs) {
  129.         printf("[%d, %d]\n", s.fst, s.snd);
  130.     }
  131.  
  132.     memset (dp, 0, sizeof dp);
  133.     dp[0][0] = 1;
  134.     forn(i, sz(segs)) {
  135.         vi nxt(A, -1);
  136.         for (int j = i; j < sz(segs); ++j) {
  137.             int c = s[segs[j].fst] - 'a';
  138.             if  (nxt[c] == -1) {
  139.                 nxt[c] = j;
  140.             }
  141.         }
  142.  
  143.         int last = i > 0 ? s[segs[i - 1].fst] - 'a' : -1;
  144.         forn(j, n) {
  145.             forn(c, A) {
  146.                 if  (c == last) {
  147.                     continue;
  148.                 }
  149.                 if  (nxt[c] == -1) {
  150.                     continue;
  151.                 }
  152.                 add(dp[nxt[c] + 1][j + 1], dp[i][j]);
  153.             }
  154.         }
  155.     }
  156.  
  157.     int ans = 0;
  158.     for (int cnt = 1; cnt <= n; ++cnt) {
  159.         int cur = 0;
  160.         forn(i, sz(segs) + 1) {
  161.             add(cur, dp[i][cnt]);
  162.         }
  163.  
  164.         add(ans, mul(cur, CC(n - cnt + 1, cnt - 1)));
  165.     }
  166.  
  167.     return ans;
  168. }
  169.  
  170. int main() {
  171. #ifdef LOCAL
  172.     freopen(FILE_NAME ".in", "r", stdin);
  173.     // freopen(FILE_NAME ".out", "w", stdout);
  174. #endif
  175.  
  176.     while (read()) {
  177.         cout << solve() << endl;
  178.     }
  179.  
  180. #ifdef LOCAL
  181.     cerr.precision(5);
  182.     cerr << "Time: " << fixed << (double) clock() / CLOCKS_PER_SEC << endl;
  183. #endif
  184.     return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement