首页 > ACM题库 > HDU-杭电 > HDU 2847-Binary String-字符串处理-[解题报告]HOJ
2014
02-17

HDU 2847-Binary String-字符串处理-[解题报告]HOJ

Binary String

问题描述 :

Give you a binary string, you can add some 1s or 0s at any places of the string. Then the result divide by K, and the remainder should be zero. Please print string of the result, if there are more, print the one with the smallest length, if still more, print the smallest lexicographical one. If there is no such result print impossible.

输入:

No more than 10 test cases. For each test case first line is a nonempty binary string whose length is no more than 20 and without leading zeros. Next line is an integer K(1 <= K <= 200).

输出:

No more than 10 test cases. For each test case first line is a nonempty binary string whose length is no more than 20 and without leading zeros. Next line is an integer K(1 <= K <= 200).

样例输入:

1000
4
11101
34
11010
70

样例输出:

1000
10101010
11010010

暴力不解释。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <string>
#include <deque>
#include <stack>
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <limits.h>
#include <time.h>
#include <string.h>
using namespace std;

int lowbit(int t){return t&(-t);}
int countbit(int t){return (t==0)?0:(1+countbit(t&(t-1)));}
int gcd(int a,int b){return (b==0)?a:gcd(b,a%b);}
#define LL long long
#define PI acos(-1.0)
#define N  1010
#define MAX INT_MAX
#define MIN INT_MIN
#define eps 1e-8
#define FRE freopen("a.txt","r",stdin)

int main(){
    char s[30];
    char ss[30];
    int n;
    while(scanf("%s%d",s,&n)!=EOF){
        int i,j,k;
        int cnt;
        int len=strlen(s);
        int sum=0;
        for(i=0;i<len;i++)sum=sum*2+s[i]-'0';
        if( sum % n == 0){printf("%s\n",s);continue;}
        else k=( sum / n + 1 )*n;
        while(1){
            int cur=k;//
            cnt=0;
            while(cur){
                ss[cnt++]=cur%2+'0';
                cur>>=1;
            }
            //ss[cnt]='\0';
            int l=0,r=cnt-1;
            while(l<len && r>=0){
                if(s[l]==ss[r]){
                    l++;
                    r--;
                }
                else
                r--;
            }
            if(l>=len)break;
            k+=n;
        }
        for(i=cnt-1;i>=0;i--)
        printf("%c",ss[i]);
        puts("");
    }
    return 0;
}

解题参考:http://blog.csdn.net/leolin_/article/details/6709890


  1. 网站做得很好看,内容也多,全。前段时间在博客园里看到有人说:网页的好坏看字体。觉得微软雅黑的字体很好看,然后现在这个网站也用的这个字体!nice!

  2. 第二个方法挺不错。NewHead代表新的头节点,通过递归找到最后一个节点之后,就把这个节点赋给NewHead,然后一直返回返回,中途这个值是没有变化的,一边返回一边把相应的指针方向颠倒,最后结束时返回新的头节点到主函数。