hdu3183(RMQ)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3183
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 7 const int maxn=1010; 8 9 int dp[maxn][21]; 10 char s[1010]; 11 char num[1010]; 12 int n; 13 14 int MIN(int i,int j) 15 { 16 return s[i]<=s[j]?i:j; 17 } 18 int query(int l,int r) 19 { 20 int k=log2(r-l+1); 21 return MIN(dp[l][k],dp[r-(1<<k)+1][k]); 22 } 23 int main() 24 { 25 while(scanf("%s %d",s,&n)!=EOF) 26 { 27 int len=strlen(s); 28 n=len-n; //选n位小的 29 30 int p=log2(len); 31 for(int i=0;i<len;i++) 32 dp[i][0]=i; 33 for(int j=1;j<=p;j++) 34 for(int i=0;i+(1<<j)-1<len;i++) 35 { 36 dp[i][j]=MIN(dp[i][j-1],dp[i+(1<<j-1)][j-1]); 37 } 38 int i=0,j=0; 39 while(n--) 40 { 41 i=query(i,len-n-1); 42 num[j++]=s[i++]; 43 } 44 for(i=0;i<j;i++) //前导0 45 if(num[i]!='0') break; 46 if(i==j) 47 { 48 puts("0"); 49 continue; 50 } 51 else 52 { 53 for(;i<j;i++) 54 printf("%c",num[i]); 55 } 56 puts(""); 57 58 } 59 }