HDU3183-RMQ(ST表)

#include<bits/stdc++.h>
using namespace std;
string s;
char Ans[10000];
int PosDP[10005][1005];
int RQ(int i,int j)
{
	return s[i] <= s[j] ? i : j;
}	
//RQ处理小值的下标。
void ST(int N) {
	int temp = (int)(log((double)N) / log(2.0));
	for (int i = 0; i < N; i++) PosDP[0][i] = i;
	for (int i = 1; i <= temp; ++i)
		for (int j = 0; j + (1 << i)-2 <N; ++j)
			PosDP[i][j] = RQ(PosDP[i - 1][j], PosDP[i - 1][j + (1 << (i - 1))]);
}
int query(int L, int R)
{
	int k = (int)(log((double)(R - L + 1)) / log(2.0));
	return RQ(PosDP[k][L], PosDP[k][R - (1 << k) + 1]);
}
int main()
{
	int i, cnt, m;
	while (cin >> s >> m)
	{
		int len = s.size();
		int tmp = len - m;
		ST(len);
		i = cnt = 0;
		while (tmp--)
		{
			i = query(i, len - tmp - 1);
			Ans[cnt++] = s[i++];
		}
		for (i = 0; i < cnt; i++)
		{
			if (Ans[i] != '0')
				break;
		}
		if (i == cnt)
		{
			puts("0");
			continue;
		}
		while (i < cnt)
		{
			cout << Ans[i];
			i++;
		}
		puts("");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_31741481/article/details/84346757
今日推荐