2014年1月24日 星期五

[USACO] 3-1-5 Contact


/*
ID: 551100k1
LANG: C++
TASK: contact
*/
#include<stdio.h>
#include<string.h>
#include<vector>
#include<iostream>
using namespace std;
struct P{
    int x,y;
};
int add[5005][15]={0},top=0;
vector<P> vec[200005];
char s[200005],c;
int main(){
    freopen("contact.in","r",stdin);
    freopen("contact.out","w",stdout);
    int a,b,n,i,j,k,num,tmp=0,line;
    scanf("%d%d%d",&a,&b,&n);
    while(scanf("%c",&c)!=EOF){
        if(c!='\n') s[top++]=c;
    }
    s[top]=0;
    for(i=0;s[i];i++){
        num=0;
        for(j=i;j<i+b && s[j];j++){
            num=num*2+(s[j]=='1');
            if(j>=i+a-1)
                add[num][j-i]++;
        }
    }
   for(j=0;j<b;j++){
        for(i=0;i<5000;i++){
            if(add[i][j]){
                vec[add[i][j]].push_back((P){i,j});
            }
        }
    }
    for(i=200000;i>=0;i--){
        if(vec[i].size()){
            printf("%d\n",i);
            for(j=0;j<vec[i].size();j++){
                if(j && j%6==0) puts("");
                if(j%6) putchar(' ');
                k=vec[i][j].x;
                string r;
                while(k){
                    r=char(k%2+'0')+r;
                    k/=2;
                }
                while(r.size()<=vec[i][j].y) r='0'+r;
                printf("%s",r.c_str());
            }
            tmp++;
            puts("");
        }
        if(tmp==n) return 0;
    }
}

沒有留言:

張貼留言