原先交的代码怎么搞都是10分,然后发现忘记吞空格了,自此已经一周... 而且用了十分奇怪的二进制模拟(?) 改前
#include <bits/stdc++.h>
using namespace std;
int s,t,w;
int str,mmm=0;
char tmp;
int count(int x){
int cnt=0;
for (int i=1<<(t-s);i>=1;i>>=1){if (x&i) cnt++;}
return cnt;
}
void print(int x){
int jl=1,c=w;
char cc[27];
for (int i=1;i<=1<<(t-s)&&jl<=(t-s)+1;i<<=1,jl++){if (x&i) cc[c--]='a'+t-jl;}
for (int i=1;i<=w;i++) putchar(cc[i]);//printf("%c",cc[i]);
cout << endl;
//printf("\n");
}
int main(){
// freopen("cantor.in","r",stdin);
// freopen("cantor.out","w",stdout);
scanf("%d%d%d",&s,&t,&w);
getchar();
for (int i=1;i<=w;i++) {
tmp=getchar();
if (tmp>='a'&&tmp<='z') str+=1<<((t-s)-(tmp-'a'+1-s));
else str+=1<<((t-s)-(tmp-'A'+1-s));
}
for (int i=str-1;i>=0&&mmm<5;i--){if (count(i)==w) print(i),mmm++;}
return 0;
}
改后
#include <bits/stdc++.h>
using namespace std;
int s,t,w;
unsigned int str,mmm=0;
char tmp;
int count(unsigned int x){
x=(x&0x55555555)+(x>>1&0x55555555);
x=(x&0x33333333)+(x>>2&0x33333333);
x=(x&0x0F0F0F0F)+(x>>4&0x0F0F0F0F);
x=(x&0x00FF00FF)+(x>>8&0x00FF00FF);
x=(x&0x0000FFFF)+(x>>16&0x0000FFFF);
return int(x);
}
void print(int x){
int jl=1,c=w;
char cc[27];
for (int i=1;i<=1<<(t-s)&&jl<=(t-s)+1;i<<=1,jl++){if (x&i) cc[c--]='a'+t-jl;}
for (int i=1;i<=w;i++) putchar(cc[i]);
puts("");
}
int main(){
scanf("%d%d%d",&s,&t,&w);
do{
tmp=getchar();
}while(tmp==' '||tmp=='\n'||tmp=='\r');
for (int i=1;i<=w;i++) {
if (tmp>='a'&&tmp<='z') str+=1<<((t-s)-(tmp-'a'+1-s));
else str+=1<<((t-s)-(tmp-'A'+1-s));
tmp=getchar();
}
for (unsigned int i=str-1;i>=0&&mmm<5;i--){if (count(i)==w) print(i),mmm++;}
return 0;
}
为我的时间和大脑默哀...