这道题要分别算出不同长度的每种可能。具体看代码吧。注意细节;
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
int A,B,n1,n=0;
int kkk[200010];
struct bala{int sum;int wei;}f[13][5000];
bala kkkk[200010];
char zifu[200010],bu;
void aaaa(int l);
void coutt(int num);
int main()
{
//freopen("contact.in","r",stdin);
//freopen("contact.out","w",stdout);
cin>>A>>B>>n1;
while(cin>>bu){
zifu[++n]=bu;
}
for(int i=A;i<=B;i++)
{int lo=(int)pow(2,i);
for(int j=1;j<lo;j++)
f[i][j].wei=j;}
for(int i=A;i<=B;i++)
aaaa(i);
int big=99999999;
for(int i=1;i<=n1;i++)
{
int max1=0,num=0;
for(int j=A;j<=B;j++){
int ll=0;
while(f[j][ll].sum>=max1&&ll<(int)pow(2,j)){
if(f[j][ll].sum==0)break;
if(f[j][ll].sum>=big){ll++;continue;}
if(f[j][ll].sum>max1){
num=1;kkkk[num].sum=j;kkkk[num].wei=f[j][ll].wei;
max1=f[j][ll].sum;
}
else {
kkkk[++num].sum=j;
kkkk[num].wei=f[j][ll].wei;
}
ll++;
}
}
if(max1==0)break;
cout<<max1<<endl;
big=max1;
coutt(num);
}
return 0;
}
void aaaa(int l)
{
for(int i=1;i<=n;i++){
for(int j=i;j>=1&&i-j<l;j--){
if(j==i)kkk[i]=zifu[i]-'0';
else kkk[j]=kkk[j]*2+zifu[i]-'0';
}
}
for(int i=1;i<=n-l+1;i++)
f[l][kkk[i]].sum++;
int lo=(int)pow(2,l);
for(int i=1;i<lo;i++)
{
int zhi=i-1,shu=i;
while(zhi>-1&&f[l][zhi].sum<f[l][shu].sum){
swap(f[l][zhi],f[l][shu]);
zhi--;shu--;
}
}
}
void coutt(int num)
{
int oo=0;
for(int i=1;i<=num;i++)
{
int a=kkkk[i].sum,b=kkkk[i].wei;
int shuzi[15],l1=0;
while(b>0){
shuzi[++l1]=b%2;
b/=2;
}
oo++;
for(int j=1;j<=a-l1;j++)
cout<<0;
for(int j=l1;j>=1;j--)
cout<<shuzi[j];
if(i<num&&oo!=6)cout<<" ";
else cout<<endl;
oo%=6;
}
}