Advertisement
trungore10

code_heavy

Dec 10th, 2018
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.60 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef unsigned long long ULL;
  5. typedef pair<ULL, int> ii;
  6.  
  7. const int N = 5004;
  8. int n, k, numMap;
  9. string str;
  10.  
  11. ULL Hash[N], Pow[N];
  12. ULL getHash(int i, int j) { return Hash[j] - Hash[i-1] * Pow[j-i+1]; }
  13.  
  14. int num[3];
  15. map<ii, int> Map;
  16. vector<int> adj[N];
  17.  
  18. int getMap(int l, int r, int type) {
  19.     ULL tmp = getHash(l, r);
  20.     if (!Map[ii(tmp, type)]) Map[ii(tmp, type)] = ++num[type];
  21.     return Map[ii(tmp, type)];
  22. }
  23.  
  24. void Build_Edge() {
  25.     int len = str.length(); str = " " + str;
  26.     for (int i = 1; i <= len; ++i) Hash[i] = Hash[i-1] * 31LL + str[i] - 'a' + 1;
  27.  
  28.     adj[getMap(1, k, 0)].push_back(getMap(len-k+1, len, 1));
  29. }
  30.  
  31. int vis[N], Match[N], Assign[N], Time;
  32.  
  33. bool DFS(int u) {
  34.     if (vis[u] == Time) return false; vis[u] = Time;
  35.     for (int v : adj[u])
  36.         if (!Assign[v] || DFS(Assign[v])) {
  37.             Assign[v] = u; Match[u] = v;
  38.             return true;
  39.         }
  40.     return false;
  41. }
  42.  
  43. void sol() {
  44.     int res = 0;
  45.     while (true) {
  46.         bool End = true; ++Time;
  47.         for (int i = 1; i <= num[0]; ++i) {
  48.             if (Match[i] || vis[i] == Time || !DFS(i)) continue;
  49.             End = false; res++;
  50.         }
  51.         if (End) break;
  52.     }
  53.     cout << res << '\n';
  54. }
  55.  
  56. int main() {
  57.     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  58.     if (fopen("input.txt", "r")) {
  59.         freopen("input.txt", "r", stdin);
  60.     }
  61.     else if (fopen("heavy.inp", "r")) {
  62.         freopen("heavy.inp", "r", stdin);
  63.         freopen("heavy.out", "w", stdout);
  64.     }
  65.  
  66.     cin >> n >> k;
  67.     for (int i = 0; i <= n; ++i) Pow[i] = (i == 0) ? 1 : Pow[i-1] * 31LL;
  68.  
  69.     for (int i = 1; i <= n; ++i) {
  70.         cin >> str;
  71.         Build_Edge();
  72.     }
  73.  
  74.     sol();
  75.  
  76.     return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement