标签: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