Advertisement
RaFiN_

min cost max flow

Apr 2nd, 2019
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.48 KB | None | 0 0
  1. ///#include <stdio.h>
  2. ///#include <iostream>
  3. ///#include <cstring>
  4. ///#include <cmath>
  5. ///#include <algorithm>
  6. ///#include <string>
  7. ///#include <vector>
  8. ///#include <map>
  9. ///#include <set>
  10. ///#include <queue>
  11. ///#include <cstdlib>
  12. ///#include <limits>
  13. ///#include <iostream>
  14. ///#include <sstream>
  15. ///#include <unordered_set>
  16. ///#include <unordered_map>
  17. ///#include <random>
  18. #include <bits/stdc++.h>
  19. ///#include <bits/stdtr1c++.h>
  20. ///#include <ext/pb_ds/assoc_container.hpp>
  21. ///#include <ext/pb_ds/tree_policy.hpp>
  22. using namespace std;
  23. ///using namespace __gnu_pbds;
  24. #define              MAX             100005
  25. #define              EPS             1e-9
  26. #define              ull             unsigned long long
  27. #define              ll              long long
  28. #define              inf             INT_MAX
  29. #define              pi              acos(-1.0)
  30. #define              vi              vector<int>
  31. #define              vl              vector<long long>
  32. #define              pii             pair<int,int>
  33. #define              pll             pair<long long,long long>
  34. #define              mp              make_pair
  35. #define              mem(a, v)       memset(a, v, sizeof (a))
  36. #define              mod             1000000007
  37. #define              all(a)          a.begin(),a.end()
  38. #define              rall(a)         a.rbegin(),a.rend()
  39. #define              ff              first
  40. #define              ss              second
  41. #define              arsort(ar,n)    sort(ar,ar+n);
  42. #define              vsort(v)        sort(v.begin(),v.end())
  43. #define              vrev(v)         reverse(v.begin(),v.end())
  44. #define              arrev(ar,n)     reverse(ar,ar+n)
  45. #define              pb              push_back
  46. #define              popb            pop_back
  47. #define              booster()       ios_base::sync_with_stdio(0); cin.tie(0);
  48. #define              read(f)         freopen(f, "r", stdin)
  49. #define              scani(x)        scanf("%d",&x)
  50. #define              scanl(x)        scanf("%I64d",&x)
  51. #define              scand(x)        scanf("%lf",&x)
  52. #define              scans(x)        scanf("%s",x)
  53. #define              min3(a,b,c)     min(a,min(b,c))
  54. #define              max3(a,b,c)     max(a,max(b,c))
  55. #define              min4(a,b,c,d)   min(min(a,b),min(c,d))
  56. #define              max4(a,b,c,d)   max(max(a,b),max(c,d))
  57. #define              max5(a,b,c,d,e) max(max3(a,b,c),max(d,e))
  58. #define              min5(a,b,c,d,e) min(min3(a,b,c),min(d,e))
  59.  
  60. #define              bitCheck(a,k)     ((bool)(a&(1<<(k))))
  61. #define              bitOff(a,k)       (a&(~(1<<(k))))
  62. #define              bitOn(a,k)        (a|(1<<(k)))
  63. #define              bitFlip(a,k)      (a^(1<<(k)))
  64.  
  65. #define              POPCOUNT           __builtin_popcount
  66. #define              POPCOUNTLL         __builtin_popcountll
  67. #define              RIGHTMOST          __builtin_ctzll
  68. #define              LEFTMOST(x)        (63-__builtin_clzll((x)))
  69.  
  70. #define scani2(a,b) scani(a) , scani(b)
  71. #define scani3(a,b,c) scani(a), scani(b), scani(c)
  72. #define scani4(a,b,c,d) scani(a), scani(b), scani(c), scani(d)
  73. #define scani5(a,b,c,d,e) scani(a), scani(b), scani(c), scani(d) , scani(e)
  74.  
  75.  
  76.  
  77. /*********************Ordered Multiset*************************/
  78.  
  79.  
  80. /*** Needs C++11 or C++14 ***/
  81. /// Treap supporting duplicating values in set
  82. /// Maximum value of treap * ADD must fit in long long
  83.  
  84. /**
  85.  
  86. struct Treap{ /// hash = 96814
  87.     int len;
  88.     const int ADD = 1000010;
  89.     const int MAXVAL = 1000000010;
  90.     tr1::unordered_map <long long, int> mp; /// Change to int if only int in treap
  91.     tree<long long, null_type, less<long long>, rb_tree_tag, tree_order_statistics_node_update> T;
  92.     Treap(){
  93.         len = 0;
  94.         T.clear(), mp.clear();
  95.     }
  96.     inline void clear(){
  97.         len = 0;
  98.         T.clear(), mp.clear();
  99.     }
  100.     inline void insert(long long x){
  101.         len++, x += MAXVAL;
  102.         int c = mp[x]++;
  103.         T.insert((x * ADD) + c);
  104.     }
  105.     inline void erase(long long x){
  106.         x += MAXVAL;
  107.         int c = mp[x];
  108.         if (c){
  109.             c--, mp[x]--, len--;
  110.             T.erase((x * ADD) + c);
  111.         }
  112.     }
  113.     /// 1-based index, returns the K'th element in the treap, -1 if none exists
  114.     inline long long kth(int k){
  115.         if (k < 1 || k > len) return -1;
  116.         auto it = T.find_by_order(--k);
  117.         return ((*it) / ADD) - MAXVAL;
  118.     }
  119.     /// Count of value < x in treap
  120.     inline int count(long long x){
  121.         x += MAXVAL;
  122.         int c = mp[--x];
  123.         return (T.order_of_key((x * ADD) + c));
  124.     }
  125.     /// Number of elements in treap
  126.     inline int size(){
  127.         return len;
  128.     }
  129. };
  130.  
  131.  
  132.  
  133. typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update>ordered_set;///*X.find_by_order();X.order_of_key();**/
  134. template <class T> inline bool isLeap(T y) {return (y % 400 == 0) || (y % 100 ? y % 4 == 0 : false); }
  135. template< class T > inline T gcd(T a, T b) { return (b) == 0 ? (a) : gcd((b), ((a) % (b))); }
  136. template< class T > inline T lcm(T a, T b) { return ((a) / gcd((a), (b)) * (b)); }
  137. template <class T> inline T BigMod(T Base,T power,T M=mod){if(power==0)return 1;if(power&1)return ((Base%M)*(BigMod(Base,power-1,M)%M))%M;else{T y=BigMod(Base,power/2,M)%M;return (y*y)%M;}}
  138. template <class T> inline T ModInv (T A,T M = mod){return BigMod(A,M-2,M);}
  139.  
  140. int fx[] = {-1,+0,+1,+0,+1,+1,-1,-1,+0};
  141. int fy[] = {+0,-1,+0,+1,+1,-1,+1,-1,+0};
  142. int day[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  143.  
  144.  
  145. /*********************** let the play begin() ***********************************/
  146.  
  147.  
  148. int pt[MAX];vi v[MAX];string ptt[MAX];int ans,dtt[MAX],non[505][505],fl[505],pos1[505],pos2[505],cl[505];
  149.  
  150. const int N = 505*2;
  151. const ll INF=(ll)1<<60;
  152. struct Edge{
  153.     ll from,to,cap,flow,cost;
  154.     Edge(int from,int to,int cap,int flow,int cost):from(from),to(to),cap(cap),flow(flow),cost(cost) {}
  155. };
  156. namespace mcmf{
  157.     int n,m,s,t;
  158.     vector<Edge> edges;
  159.     vector<ll> G[N];
  160.     bool inq[N];
  161.     ll d[N],p[N],a[N];                     /// N = Size of nodes in flow network
  162.     void init(int src,int sink,int node)
  163.     {
  164.         n=node;
  165.         s= src;
  166.         t = sink;
  167.         edges.clear();
  168.         for(int i=0;i<=n;++i) G[i].clear();
  169.     }
  170.     void addEdge(int from,int to,ll cap,ll cost)
  171.     {
  172.         edges.push_back(Edge(from,to,cap,0,cost));
  173.         edges.push_back(Edge(to,from,0,0,-cost));
  174.         m=edges.size();
  175.         G[from].push_back(m-2);
  176.         G[to].push_back(m-1);
  177.     }
  178.     bool spfa(ll &flow,ll& cost)
  179.     {
  180.         for(int i=0;i<=n;++i) d[i]=INF,inq[i]=0;
  181.         queue<int> que;
  182.         que.push(s);
  183.         inq[s]=1;d[s]=0;p[s]=0;a[s]=INF;
  184.         while(!que.empty())
  185.         {
  186.             int x=que.front();que.pop();
  187.             inq[x]=0;
  188.             for(int i=0;i<G[x].size();++i)
  189.             {
  190.                 Edge &e=edges[G[x][i]];
  191.                 if(e.cap>e.flow && d[e.to]>d[x]+e.cost)
  192.                 {
  193.                     d[e.to]=d[x]+e.cost;
  194.                     p[e.to]=G[x][i];
  195.                     a[e.to]=min(a[x],e.cap-e.flow);
  196.                     if(!inq[e.to]) inq[e.to]=1,que.push(e.to);
  197.                 }
  198.             }
  199.         }
  200.         if(d[t]==INF) return 0;
  201.         flow+=a[t];
  202.         cost+=d[t];    /// multiply by d[t]*a[t] if per unit cost is given.
  203.         int u=t;
  204.         while(u!=s)
  205.         {
  206.             edges[p[u]].flow+=a[t];
  207.             edges[p[u]^1].flow-=a[t];
  208.             u=edges[p[u]].from;
  209.         }
  210.         return 1;
  211.     }
  212.     pll solve()
  213.     {
  214.         ll flow=0,cost=0;
  215.         while(spfa(flow,cost));
  216.         return make_pair(cost,flow);
  217.     }
  218. }
  219.  
  220. int sor;
  221.  
  222. int occ(string s,string ss,int indx)
  223. {
  224.     int z[1005];
  225.     mem(z,0);
  226.  
  227.     int n = s.length();
  228.  
  229.     int L = 0, R = 0;
  230. for (int i = 1; i < n; i++) {
  231.   if (i > R) {
  232.     L = R = i;
  233.     while (R < n && s[R-L] == s[R]) R++;
  234.     z[i] = R-L; R--;
  235.   } else {
  236.     int k = i-L;
  237.     if (z[k] < R-i+1) z[i] = z[k];
  238.     else {
  239.       L = i;
  240.       while (R < n && s[R-L] == s[R]) R++;
  241.       z[i] = R-L; R--;
  242.     }
  243.   }
  244. }
  245.     int cnt = 0;
  246.     for(int i = 0;i<n;i++)
  247.     {
  248.         if(z[i]==ss.length())
  249.         {
  250.             mcmf::addEdge(i-ss.length()-1,i-1,1,-dtt[indx]);
  251.  
  252.         }
  253.     }
  254.     return cnt;
  255.  
  256. }
  257.  
  258.  
  259.  
  260. int main()
  261. {
  262.     booster()
  263.     ///read("input.txt");
  264.  
  265.     string s;
  266.     int n;
  267.     cin>>n>>s;
  268.     int cnt = 0;
  269.     for(int i = 0;i<n;i++)
  270.     {
  271.         pos1[i] = cnt++;
  272.         pos2[i] = cnt++;
  273.     }
  274.     ///cout<<cnt<<endl;
  275.     sor = cnt;
  276.     mcmf::init(n+1,n+2,n+3);
  277.     int m;
  278.     cin>>m;
  279.     for(int i = 0;i<m;i++)
  280.     {
  281.         cin>>ptt[i]>>dtt[i];
  282.     }
  283.     int q;
  284.     cin>>q;
  285.     for(int i = 0;i<n;i++)mcmf::addEdge(i,i+1,q,0);
  286.     for(int i = 0;i<m;i++)
  287.     {
  288.         string ss = ptt[i]+'#'+s;
  289.         occ(ss,ptt[i],i);
  290.     }
  291.     mcmf::addEdge(n+1,0,q,0);
  292.     mcmf::addEdge(n,n+2,q,0);
  293.     pll x = mcmf::solve();
  294.     cout<<-x.ff;
  295.  
  296.  
  297.  
  298.  
  299.     return 0;
  300. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement