HDU3183-RMQ(ST表)
阿新 • • 發佈:2018-11-27
#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; }