标签:hdu3183 a magic lamp rmq模板 st算法 数据结构
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183
ST(实质是动态规划),O(nlogn)-O(q) online。
第一次写这种类型的题目,这里有一个很好的博客推荐,分别写出了返回下标和返回值的模板,可以看着学一下,链接:http://blog.csdn.net/allenjy123/article/details/6629272
#include<iostream>
#include<string>
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<cmath>
#include<stack>
#include<set>
#include<vector>
#include<algorithm>
#define LL long long
#define inf 1<<30
using namespace std;
const int N=1035;
int n,m;
int dp[N][25]; // 把这个数组写成了char型的,WA到死啊。。。orz...
char s1[N];
char ans[N];
int Min(int a,int b) // 返回下标;
{
return s1[a]<=s1[b]?a:b;
}
void make_rmq() // 返回下标的RMQ;
{
for(int i=0;i<n;i++) dp[i][0]=i; // 长度为0的初始值;
for(int j=1;(1<<j)<n;j++){
for(int i=0;i+(1<<j)-1<n;i++){
dp[i][j]=Min(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
}
}
int query_rmq(int s,int v) // 查询;
{
int k=(int)((log((v-s+1)*1.0))/(log(2.0))); // 对数换底公式,求K的长度;
return Min(dp[s][k],dp[v-(1<<k)+1][k]);
}
int main()
{
while(~scanf("%s %d",s1,&m)){
n=strlen(s1); // 存储输入字符串的长度;
make_rmq();
int t=n-m; // 要输出的长度;
int q=0,p=0;
while(t--){
q=query_rmq(q,m++); // 查询从下标q开始下标为m的最小值;(这里需要好好理解)
ans[p++]=s1[q++];
}
for(q=0;q<p;q++) if(ans[q]!='0')break;
if(p==q) printf("0");
else while(q<p) printf("%c",ans[q++]);
printf("\n");
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
HDU-3183-A Magic Lamp-RMQ+ST(模板)
标签:hdu3183 a magic lamp rmq模板 st算法 数据结构
原文地址:http://blog.csdn.net/wlxsq/article/details/47273349