避雷
查看原帖
避雷
756747
Ithea686楼主2023/5/13 16:16

原先交的代码怎么搞都是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;
}

为我的时间和大脑默哀...

2023/5/13 16:16
加载中...