Advertisement
Guest User

Untitled

a guest
Oct 17th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.29 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <vector>
  4. #include <string>
  5. #include <cmath>
  6. #include <unordered_map>
  7. #include <stack>
  8. #include <cassert>
  9. #include <algorithm>
  10. #include <iomanip>
  11. #include <map>
  12. #include <queue>
  13. #include <set>
  14.  
  15. #include <iostream>
  16. #include <climits>
  17. #include <vector>
  18. #include <cassert>
  19. #include <algorithm>
  20. #include <set>
  21. #include <map>
  22. #include <set>
  23.  
  24. using namespace std;
  25.  
  26. typedef long long ll;
  27.  
  28. const int MAXN = 4;
  29. const int MAX_LEN = 100;
  30. const int ALPHA = 30;
  31.  
  32. string str[MAXN + 10];
  33. ll dp[MAX_LEN + 10][MAX_LEN + 10][MAX_LEN + 10];
  34. ll calc[MAX_LEN + 10][ALPHA + 10][ALPHA + 10];
  35.  
  36.  
  37. ll go(vector<string> vec) {
  38.     memset(dp, 0, sizeof(dp));
  39.     memset(calc, 0, sizeof(calc));
  40.     for (int i = 0; i < vec[4].size(); i++) {
  41.         for (int j = i; j < vec[4].size(); j++) {
  42.             ++calc[j - i][vec[4][i] - 'a'][vec[4][j] - 'a'];
  43.         }
  44.     }
  45.     for (int len = 1; len <= MAX_LEN; len++) {
  46.         for (int i = (int) vec[2].size() - 1; i >= 0; i--) {
  47.             for (int j = (int) vec[1].size() - 1; j >= 0; j--) {
  48.                 dp[len][i][j] = dp[len][i + 1][j + 1] + calc[len][vec[2][i] - 'a'][vec[1][j] - 'a'];
  49.             }
  50.         }
  51.     }
  52.     ll ans = 0;
  53.     for (int i = 0; i < (int)vec[0].size(); i++) {
  54.         for (int j = i + 2; j < (int)vec[0].size(); j++) {
  55.             for (int l = 0; l < (int)vec[1].size(); l++) {
  56.                 if (vec[0][i] != vec[1][l]) {
  57.                     continue;
  58.                 }
  59.                 for (int r = 0; r < (int)vec[2].size(); r++) {
  60.                     if (vec[0][j] != vec[2][r]) {
  61.                         continue;
  62.                     }
  63.                     ans += dp[j - i][l + 2][r + 2];
  64.                 }
  65.             }
  66.         }
  67.     }
  68.     return ans;
  69. }
  70.  
  71. int main() {
  72.     //freopen("input.txt", "r", stdin);
  73.     //freopen("grand.in", "r", stdin);
  74.     //freopen("grand.out", "w", stdout);
  75.  
  76.     int n = 4;
  77.     for (int i = 0; i < n; i++) {
  78.         cin >> str[i];
  79.     }
  80.  
  81.     vector<int> vec;
  82.     for (int i = 0; i < n; i++) {
  83.         vec.push_back(i);
  84.     }
  85.  
  86.     ll ans = 0;
  87.  
  88.     do {
  89.         ans += go({ str[vec[0]], str[vec[1]], str[vec[2]], str[vec[3]] });
  90.     } while (next_permutation(vec.begin(), vec.end()));
  91.  
  92.     cout << ans << "\n";
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement