2019计蒜之道 复赛
D. 星云系统
给一个字符串,求其字典序最小的长度为k的子串。
删数问题大数据版,单调栈。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<stack>
#include<cstdlib>
#include<string.h>
#include<iomanip>
#define ll long long
#define Max(a,b) ((a) > (b) ? (a) : (b))
#define INF 0x3f3f3f3f
#define N 5000000+10
const int mod = 1e9+7;
const int maxn = 1e5 + 10 ;
typedef std::pair<int, int> pii;
typedef std::pair<ll, ll> pll;
ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
using namespace std;
string s,t;
stack<int> stk,o;
int k;
int main(){
getline(cin,s);
cin>>k;
int cnt=0,len=s.size();
int n=len-k;
stk.push(cnt);
while(n && cnt<len-1)
{
++cnt;
while(s[cnt]<s[stk.top()] && n && cnt<len-1)
{
//cout<<"pop:"<<s[stk.top()]<<endl;
stk.pop();
n--;
if(stk.empty()) break;
}
stk.push(cnt);
}
while(cnt<len){
cnt++;
stk.push(cnt);
}
while(!stk.empty())
{
o.push(stk.top());
stk.pop();
}//倒序输出
while(!o.empty()&&k--)
{
cout<<s[o.top()];
o.pop();
}
printf("\n");
return 0;
}
浙公网安备 33010602011771号