Submission #256493

#TimeUsernameProblemLanguageResultExecution timeMemory
256493shayan_pVim (BOI13_vim)C++14
100 / 100
631 ms9336 KiB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 70100, mod = 1e9 + 7, inf = 1e9 + 10;

int nxt[maxn][10], nxt2[maxn][10], lst[10], a[maxn];
int dp[maxn][10], DP[maxn], DP2[maxn], DP3[maxn];
vector<int> poses;

int dis(int a, int b){
    if(a > b)
	return inf;
    if(a == b)
	return 0;
    int mx = a;
    for(int i = 0; i < 9; i++){
	if(nxt[a][i] <= b)
	    mx = max(mx, nxt[a][i]);
    }
    return 2 + dis(mx, b);
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie();

    int n;
    cin >> n;
    string _s, s;
    cin >> _s;
    int ans = 0;
    for(int i = 0; i < n; i++){
	if(_s[i] == 'e')
	    ans+= 2;
	if(_s[i] == 'e' && _s[i + 1] != 'e')
	    poses.PB(sz(s));
	if(_s[i] != 'e')
	    s+= _s[i];	
    }
    memset(lst, -1, sizeof lst);
    memset(nxt, -1, sizeof nxt);
    n = sz(s);
    for(int i = n-1; i >= 0; i--){
	for(int j = 0; j < 9; j++)
	    nxt[i][j] = (lst[j] == -1 ? i : lst[j]);
	int id = (s[i] - 'a') - (s[i] > 'e');
	a[i] = id;
	lst[id] = i;
	for(int j = 0; j < 9; j++)
	    nxt2[i][j] = (lst[j] == -1 ? i : lst[j]);
    }

    for(int i = 0; i < maxn; i++){
	for(int j = 0; j < 10; j++)
	    dp[i][j] = inf;
	DP[i] = DP2[i] = DP3[i] = inf;
    }
    for(int i = poses.back(); i < maxn; i++){
	DP[i] = DP2[i] = DP3[i] = 0;
    }
    
    int pt = sz(poses) - 1;
    for(int i = poses.back() - 1; i >= 0; i--){
	for(int j = 0; j < 9; j++){
	    if(nxt[i][j] > i){
		DP3[i] = min(DP3[i], 2 + DP3[ nxt[i][j] ] + nxt[i][j] - i);		
	    }
	}
	for(int j = 0; j < 9; j++){
	    if(nxt[i][j] > i){
		if(nxt[i][j] < poses[pt]) // <= ? 
		    DP2[i] = min(DP2[i], 2 + DP2[ nxt[i][j] ]);
		else
		    DP2[i] = min(DP2[i], 2 + DP3[ nxt[i][j] ] + nxt[i][j] - poses[pt]);		
	    }
	}
	DP[i] = DP2[i];
	for(int j = 0; j < 9; j++){
	    int x = nxt[i][j];
	    if(x == i)
		continue;
	    if(x <= poses[pt]){
		DP[i] = min(DP[i], 2 + DP[x]);
	    }
	    else{
		for(int k = 0; k < 9; k++){
		    DP[i] = min(DP[i], 2 + x - poses[pt] + dis(poses[pt], nxt2[x][k]) + dp[x][k]);
		}
	    }
	}
	for(int j = 0; j < 9; j++){
	    int x = nxt2[i][j];
	    if(x <= poses[pt]){
		dp[i][j] = DP[x];
	    }
	    else{
		dp[i][j] = x - poses[pt] + DP3[x];
		for(int k = 0; k < 9; k++)
		    dp[i][j] = min(dp[i][j], x - poses[pt] + dis(poses[pt], nxt2[x][k]) + dp[x][k]);
	    }
	    for(int k = 0; k < 9; k++){
		int xx = nxt[i][k];
		if(xx == i)
		    continue;
		for(int k2 = 0; k2 < 9; k2++)
		    dp[i][j] = min(dp[i][j], 2 + xx - i + dis(x, nxt2[xx][k2]) + dp[xx][k2]);
	    }
	}
	if(pt > 0 && poses[pt-1] == i){
	    pt--;
	}
    }
    ans+= DP[0];
    return cout << ans << "\n", 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...