题目链接:http://codeforces.com/contest/128/problem/B
题目大意:给一个字符串,求字典序第k小子串
题目思路:当时完全没想法,赛后听到思路直接醒悟,跟之前牛客第二场的第k小团简直一模一样...还特地写了题解,居然没做出来,丢人...
思路非常简单,先把每个字符单个扔进优先队列,优先队列按照字典序排序,然后每次加入一个字符扔回去,第k个取出来的就是答案,几乎跟那个题完全一样,难受
以下是代码:
#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
#define inf 0x3f3f3f3f
const int MAXN = 1e5+5;
char s[MAXN];
int k;
struct node{
int pos;
string a;
bool operator <(const node &r)const{
if(r.a==a)return pos>r.pos;
return a>r.a;
}
}x;
priority_queue<node>q;
int main()
{
while(~scanf("%s%d",s+1,&k)){
while(!q.empty())q.pop();
int len=strlen(s+1);
rep(i,1,len){
x.a="";
x.a+=s[i];
x.pos=i;
q.push(x);
}
while(!q.empty()){
x=q.top();
q.pop();
k--;
if(!k)break;
if(x.pos<len){
x.pos++;
x.a+=s[x.pos];
q.push(x);
}
}
if(k)cout<<"No such line."<<endl;
else cout<<x.a<<endl;
}
return 0;
}