#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define popcount __builtin_popcount using namespace std; typedef long long int ll; typedef pair P; struct MinCostFlow{ struct edge{ int to, cap, rev; ll cost; edge(int to, int cap, ll cost, int rev):to(to), cap(cap), cost(cost), rev(rev){} }; int n; vector> g; vector h, dist; vector prevv, preve; MinCostFlow(int n):n(n), g(n), h(n), dist(n), prevv(n), preve(n){} void add_edge(int from, int to, int cap, ll cost){ edge e=edge(to, cap, cost, g[to].size()); g[from].push_back(e); e=edge(from, 0, -cost, g[from].size()-1); g[to].push_back(e); } ll flow(int s, int t, int f){ using P=pair; const ll INF=1e18; ll res=0; fill(h.begin(), h.end(), 0); while(f>0){ priority_queue, greater

> que; fill(dist.begin(), dist.end(), INF); dist[s]=0; que.push({0, s}); while(!que.empty()){ P p=que.top(); que.pop(); int v=p.second; if(dist[v]0 && dist[e.to]>dist[v]+e.cost+h[v]-h[e.to]){ dist[e.to]=dist[v]+e.cost+h[v]-h[e.to]; prevv[e.to]=v; preve[e.to]=i; que.push({dist[e.to], e.to}); } } } for(int v=0; v>n; cin>>s; for(int i=0; i>v[i]; MinCostFlow mcf(n+1); const ll inf=1e9; string s0="yuki"; int idx[5]; fill(idx, idx+5, n+1); idx[4]=n; for(int i=n-1; i>=0; i--){ for(int k=0; k<4; k++){ if(s0[k]!=s[i])continue; if(idx[k]<=n) mcf.add_edge(i, idx[k], n/4, 0); if(idx[k+1]<=n) mcf.add_edge(i, idx[k+1], 1, inf-v[i]); idx[k]=i; } } if(idx[0]==n+1){ cout<<0<