luoguP1555 尴尬的数字(暴力+map)

题意

题解

枚举每一个可能的二进制数。扔到一个map里

再枚举每一个可能的三进制数看map有没有就行了

反正就是很水

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<map>
 7 using namespace std;
 8 map<long long,bool>ma;
 9 char s1[20000],s2[20000];
10 long long ksm(long long x,long long b){
11     long long tmp=1;
12     while(b){
13         if(b&1){
14             tmp*=x;
15         }
16         b>>=1;
17         x=x*x;
18     }
19     return tmp;
20 }
21 void work(char s[]){
22     long long len=strlen(s+1);
23     long long tmp=0;
24     for(long long i=1;i<=len;i++){
25         tmp=tmp*2+s[i]-'0';
26     }
27     for(long long i=1;i<=len;i++){
28         long long ans=tmp+(((s[i]-'0')^1)-(s[i]-'0'))*(1<<len-i);
29         ma[ans]=1;
30     }
31 }
32 void work1(char s[]){
33     long long len=strlen(s+1);
34     long long tmp=0;
35     for(long long i=1;i<=len;i++){
36         tmp=tmp*3+s[i]-'0';
37     }
38     for(long long i=1;i<=len;i++){
39         for(long long j=0;j<=2;j++){
40             if(j==s[i]-'0')continue;
41             long long ans=tmp+(j-(s[i]-'0'))*ksm(3,len-i);
42             if(ma[ans]==1){
43                 printf("%lld",ans);
44                 return ;
45             }
46         }
47     }
48 }
49 int main(){
50     scanf("%s",s1+1);
51     scanf("%s",s2+1);
52     work(s1);
53     work1(s2);
54     return 0;
55 } 

 

posted @ 2018-08-31 10:59  Xu-daxia  阅读(275)  评论(0编辑  收藏  举报