Advertisement
Guest User

josdas

a guest
Oct 3rd, 2015
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.71 KB | None | 0 0
  1.  
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #pragma comment(linker, "/STACK:66777216")
  4. #include <iostream>
  5. #include <cstdio>
  6. #include <cmath>
  7. #include <vector>
  8. #include <ctime>
  9. #include <map>
  10. #include <set>
  11. #include <string>
  12. #include <queue>
  13. #include <deque>
  14. #include <cassert>
  15. #include <cstdlib>
  16. #include <bitset>
  17. #include <algorithm>
  18. #include <string>
  19. #include <list>
  20. #include <fstream>
  21. #include <unordered_set>
  22.  
  23. using namespace std;
  24.  
  25. typedef unsigned long long ull;
  26. typedef long long ll;
  27. typedef long double ld;
  28.  
  29. #define forn(i, n) for (int i = 0; i < (ll)n; i++)
  30. #define fornn(i, q, n) for (int i = q; i < (ll)n; i++)
  31. #define mp make_pair
  32. #define pk push_back
  33. #define all(v) v.begin(), v.end()
  34. #define times clock() * 1.0 / CLOCKS_PER_SEC
  35. #define mk make_pair
  36. #define inb push_back
  37. #define outb pop_back
  38.  
  39. #define TASK "race"
  40.  
  41. const double eps = 1e-7;
  42. const double pi = acos(-1.0);
  43.  
  44. const int inf = (int)2e9 + 1;
  45. const ll linf = (ll)9e18 + 7;
  46. const ll dd = 2e5 + 5;
  47. const ll MM = (ll)1e9 + 7;
  48. const ll mod = (ll)1e9 + 7;
  49. const ll p1 = 31;
  50.  
  51. int solve();
  52. void gen();
  53.  
  54. int main() {
  55. #ifdef _DEBUG
  56.     freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout);
  57. #else
  58.     freopen(TASK".in", "r", stdin), freopen(TASK".out", "w", stdout);
  59.     //freopen("input.txt", "r", stdin), freopen("output.txt", "w", stdout), freopen("test.txt", "w", stderr);
  60. #endif
  61.     solve();
  62.     return 0;
  63. }
  64.  
  65. struct tr{
  66.     vector<vector<pair<char, int> > > Z;
  67.     vector<string> G;
  68.     vector<ll> H, S, dp;
  69.     vector<int> W;
  70.     multiset<ll> T;
  71.     int g = 1;
  72.  
  73.     tr(){
  74.         T.insert(0);
  75.         W.resize(1);
  76.         H.resize(1);
  77.         S.resize(1);
  78.         G.resize(1);
  79.         dp.resize(1);
  80.         Z.resize(1);
  81.     }
  82.     void add(string t){
  83.         G.push_back(t);
  84.         int v = 0;
  85.         vector<int> Q;
  86.         Q.push_back(0);
  87.         for (int i = 0; i < t.size(); i++){
  88.             int d = -1;
  89.             forn(j, Z[v].size()){
  90.                 if (Z[v][j].first == t[i]){
  91.                     d = Z[v][j].second;
  92.                     break;
  93.                 }
  94.             }
  95.             if (d >= 0){
  96.                 v = d;
  97.                 if (i == (t.size() - 1))
  98.                     W[v]++;
  99.             }
  100.             else{
  101.                 Z[v].push_back(mk(t[i], g));
  102.                 v = g;
  103.                 S.push_back(0);
  104.                 H.push_back(i + 1);
  105.                 dp.push_back(0);
  106.                 T.insert(0);
  107.                 W.push_back(i == (t.size() - 1));
  108.                 Z.push_back(vector<pair<char, int> >());
  109.                 g++;
  110.             }
  111.             Q.push_back(v);
  112.         }
  113.         for (int i = Q.size() - 1; i >= 0; i--){
  114.             int t = Q[i];
  115.             T.erase(T.find(dp[t]));
  116.             ll s = W[t];
  117.             forn(j, Z[t].size()){
  118.                 s += S[Z[t][j].second];
  119.             }
  120.             S[t] = s;
  121.             dp[t] = s * H[t];
  122.             T.insert(dp[t]);
  123.         }
  124.     }
  125. };
  126.  
  127. struct trr{
  128.     vector<vector<pair<char, int> > > Z;
  129.     vector<vector<int> > Q;
  130.     int g = 1;
  131.  
  132.     trr(){
  133.         Q.resize(1);
  134.         Z.resize(1);
  135.     }
  136.     void add(string t, int gg){
  137.         int v = 0;
  138.         for (int i = 0; i < t.size(); i++){
  139.             int d = -1;
  140.             forn(j, Z[v].size()){
  141.                 if (Z[v][j].first == t[i]){
  142.                     d = Z[v][j].second;
  143.                     break;
  144.                 }
  145.             }
  146.             if (d >= 0){
  147.                 v = d;
  148.                 if (i == t.size() - 1)
  149.                     Q[v].push_back(gg);
  150.             }
  151.             else{
  152.                 Z[v].push_back(mk(t[i], g));
  153.                 v = g;
  154.                 g++;
  155.                 Q.push_back(vector<int>());
  156.                 Z.push_back(vector<pair<char, int> >());
  157.                 if (i == t.size() - 1)
  158.                     Q[v].push_back(gg);
  159.             }
  160.         }
  161.     }
  162. } Ro;
  163.  
  164. ll res = 0;
  165. vector<string> Gg, Rg;
  166.  
  167. tr *dfs(int v, ll h){
  168.     tr *qw = new tr();
  169.     forn(i, Ro.Q[v].size()){
  170.         qw->add(Rg[Ro.Q[v][i]]);
  171.     }
  172.     forn(i, Ro.Z[v].size()){
  173.         auto t = dfs(Ro.Z[v][i].second, h + 1);
  174.         if (qw->g < t->g)
  175.             swap(qw, t);
  176.         forn(i, t -> G.size()){
  177.             qw->add(t->G[i]);
  178.         }
  179.     }
  180.     if (qw->T.size())
  181.         res = max(res, (*(qw->T.rbegin())) * h);
  182.     return qw;
  183. }
  184.  
  185. int n;
  186. int solve() {
  187.     cin >> n;
  188.     Gg.resize(n);
  189.     forn(i, n){
  190.         string t;
  191.         cin >> t;
  192.         Ro.add(t, i);
  193.         reverse(t.begin(), t.end());
  194.         Rg.push_back(t);
  195.     }
  196.     dfs(0, 0);
  197.     cout << res;
  198.     return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement