Advertisement
kolychestiy

gavno

Apr 5th, 2022
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const long long INF64 = 4e18 + 5;
  6. const long double eps = 1e-10;
  7. const int SZ = 1e6 + 5;
  8. const int INF32 = 2e9 + 5;
  9. const int mod = 1e9 + 7;
  10.  
  11. // #define int long long
  12.  
  13. struct Node{
  14.     unordered_map<char, Node *> mp;
  15.     int val = 0;
  16.     int cnt = 0;
  17.  
  18.     Node(){}
  19. };
  20.  
  21. void add(Node *&v, string &s, int i = 0){
  22.     if(s.size() == i){
  23.         v->cnt = 1;
  24.         return;
  25.     }
  26.  
  27.     if(!v->mp[s[i]]) v->mp[s[i]] = new Node();
  28.     add(v->mp[s[i]], s, i + 1);
  29. }
  30.  
  31. void dfs(Node *&v){
  32.     if(!v) return;
  33.     v->val = v->cnt;
  34.  
  35.     for(auto &p : v->mp){
  36.         dfs(p.second);
  37.         v->val += p.second->val;
  38.     }
  39. }
  40.  
  41. void jfs(Node *&v, Node *&suffix, int &ans, char last = '?', int h = 0, string s = ""){
  42.     if(h > 1)
  43.         ans -= suffix->mp[last]->val;
  44.  
  45.     for(auto &p : v->mp)
  46.         jfs(p.second, suffix, ans, p.first, h + 1, s + p.first);
  47. }
  48.  
  49. int go(Node *&v, string &s, int i = 0){
  50.     if(s.size() == i)
  51.         return v->val;
  52.  
  53.     return go(v->mp[s[i]], s, i + 1);
  54. }
  55.  
  56. void Solve(){
  57.     int n; cin >> n;
  58.     int S = 0;
  59.  
  60.     Node *prefix = new Node(), *suffix = new Node();
  61.  
  62.     {
  63.         string t = "";
  64.         add(suffix, t);
  65.     }
  66.  
  67.     for(int i = 1; i <= n; i++){
  68.         string s; cin >> s;    
  69.         string t = "";
  70.  
  71.         S += s.size();
  72.  
  73.         for(int j = 0; j < s.size(); j++){
  74.             t += s[j];
  75.             add(prefix, t);
  76.         }
  77.  
  78.         for(int j = s.size() - 1; j >= 0; j--){
  79.             string t = "";
  80.  
  81.             for(int k = j; k < s.size(); k++)
  82.                 t += s[k];
  83.  
  84.             add(suffix, t);
  85.         }
  86.     }
  87.  
  88.  
  89.     dfs(prefix);
  90.     dfs(suffix);
  91.  
  92.     int ans = 0;
  93.     jfs(prefix, suffix, ans);
  94.  
  95.     {
  96.         string s = "e";
  97.         // cout << go(suffix, s) << endl;
  98.     }
  99.  
  100.     ans += prefix->val * suffix->val - (S - n);
  101.  
  102.     cout << ans << '\n';
  103. }
  104.  
  105. signed main(){
  106.     ios_base::sync_with_stdio(NULL);
  107.     cin.tie(NULL);
  108.     cout.tie(NULL);
  109.     srand(time(NULL));
  110.     cout << fixed << setprecision(10);
  111.  
  112.     freopen("input.txt", "r", stdin);
  113.  
  114.     // freopen("eve.in", "r", stdin);
  115.     // freopen("eve.out", "w", stdout);
  116.  
  117.     int test = 1;
  118.     // cin >> test;
  119.  
  120.     for(int i = 1; i <= test; i++){
  121.         Solve();
  122.     }
  123. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement