Advertisement
Guest User

Untitled

a guest
Aug 15th, 2015
454
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. #include <iostream>
  2. #include <sstream>
  3. #include <fstream>
  4. #include <iomanip>
  5. #include <cstdio>
  6. #include <cstdlib>
  7. #include <algorithm>
  8. #include <queue>
  9. #include <stack>
  10. #include <set>
  11. #include <map>
  12. #include <list>
  13. #include <vector>
  14. #include <string>
  15. #include <cstring>
  16. #include <cmath>
  17. #include <ctime>
  18. #include <cassert>
  19. #include <bitset>
  20.  
  21. using namespace std;
  22.  
  23. #define forn(i, n) for(int i = 0; i < (int)(n); i++)
  24. #define forn1(i, n) for(int i = 1; i <= (int)(n); i++)
  25. #define forr(i, l, r) for(int i = int(l); i <= int(r); i++)
  26. #define all(a) (a).begin(), (a).end()
  27. #define sz(a) (int)((a).size())
  28. #define mp make_pair
  29. #define pb push_back
  30. #define x first
  31. #define y second
  32. #define y1 __y1
  33. #define sqr(x) ((x) * (x))
  34.  
  35. typedef long long li;
  36. typedef long double ld;
  37. typedef pair<int, int> pt;
  38.  
  39. const int INF = (int)(1e9);
  40. const li INF64 = (li)(INF) * (li)(INF);
  41. const ld eps = 1e-9;
  42. const ld pi = ld(3.1415926535897932384626433832795);
  43.  
  44. inline bool in(int i, int j, int n, int m)
  45. {
  46.     return i >= 1 && i <= n && j >= 1 && j <= m;
  47. }
  48.  
  49. inline int myrand()
  50. {
  51.     return (rand() ^ (rand() << 15));
  52. }
  53.  
  54. const int dx[] = {-1, 0, 1, 0};
  55. const int dy[] = {0, 1, 0, -1};
  56.  
  57. const int N = 111;
  58.  
  59. char a[N], b[N];
  60. int n, m, L;
  61.  
  62. inline void gen()
  63. {
  64.     return;
  65. }
  66.  
  67. inline bool read()
  68. {
  69.     string s1, s2;
  70.     assert(cin >> s1 >> s2);
  71.     n = sz(s1);
  72.     forn(i, n) a[i + 1] = s1[i];
  73.     m = sz(s2);
  74.     forn(i, m) b[i + 1] = s2[i];
  75.     assert(cin >> L);
  76.     return true;
  77. }
  78.  
  79. const int MOD = INF + 7;
  80.  
  81. inline void add(int &a, const int &b)
  82. {
  83.     a += b;
  84.     if(a >= MOD) a -= MOD;
  85.     return;
  86. }
  87.  
  88. int dp[N][N][N];
  89. int leftMostA[N][256], leftMostB[N][256];
  90. int lf[256];
  91.  
  92. inline void solve()
  93. {
  94.     forn(i, 256) lf[i] = INF;
  95.     for(int i = n; i >= 0; i--)
  96.     {
  97.         for(char c = 'a'; c <= 'z'; c++)
  98.         {
  99.             leftMostA[i][c] = lf[c];
  100.         }
  101.  
  102.         lf[a[i]] = i;
  103.     }
  104.  
  105.     forn(i, 256) lf[i] = INF;
  106.     for(int i = m; i >= 0; i--)
  107.     {
  108.         for(char c = 'a'; c <= 'z'; c++)
  109.         {
  110.             leftMostB[i][c] = lf[c];
  111.         }
  112.  
  113.         lf[b[i]] = i;
  114.     }
  115.  
  116.     forn(i, N) forn(j, N) forn(k, N) assert(dp[i][j][k] == 0);
  117.     dp[0][0][0] = 1;
  118.     for(int i = 0; i < n; i++)
  119.     {
  120.         for(int j = 0; j < m; j++)
  121.         {
  122.             for(int len = 0; len < n; len++)
  123.             {
  124.                 int cur = dp[i][j][len];
  125.                 if(cur == 0) continue;
  126.                 for(char c = 'a'; c <= 'z'; c++)
  127.                 {
  128.                     int ni = leftMostA[i][c];
  129.                     int nj = leftMostB[j][c];
  130.                     if(ni <= n && nj <= m)
  131.                     {
  132.                         assert(a[ni] == b[nj]);
  133.                         assert(a[ni] == c);
  134.                         add(dp[ni][nj][len + 1], cur);
  135.                     }
  136.                 }
  137.             }
  138.         }
  139.     }
  140.  
  141.     int ans = 0;
  142.     forn(i, N) forn(j, N) add(ans, dp[i][j][L]);
  143.     cout << ans << endl;
  144.     return;
  145. }
  146.  
  147. int main()
  148. {
  149. #ifdef _DEBUG
  150.     assert(freopen("input.txt", "rt", stdin));
  151.     assert(freopen("output.txt", "wt", stdout));
  152. #endif
  153.  
  154.     cout << setprecision(10) << fixed;
  155.     cerr << setprecision(10) << fixed;
  156.  
  157.     srand(int(time(NULL)));
  158.  
  159.     int T = 1;
  160.     //assert(scanf("%d", &T) == 1);
  161.  
  162.     forn(i, T)
  163.     {
  164.         assert(read());
  165.         solve();
  166.     }
  167.  
  168. #ifdef _DEBUG
  169.     cerr << "TIME == " << clock() << " ms" << endl;
  170. #endif
  171.     return 0;
  172. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement