注意排序的思想
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
map<string,int>str,solve;
str.clear();
solve.clear();
getchar();
for(int i=0;i<n;i++)
{
string s;
s.clear();
getline(cin,s,'\n');
//cout<<s<<endl;
str[s]++;
sort(s.begin(),s.end());
solve[s]++;
}
int q;
scanf("%d",&q);
getchar();
for(int i=0;i<q;i++)
{
string s;
s.clear();
getline(cin,s,'\n');
int num1=str[s];
sort(s.begin(),s.end());
int num2=solve[s];
printf("%d\n",num2-num1);
}
return 0;
}
枚举2出现的位置
//枚举2出现的位置
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
LL num[33];
num[0]=0;
num[1]=1;
for(int i=2;i<=32;i++)
num[i]=num[i-1]*2+1;
int T;
scanf("%d",&T);
while(T--)
{
LL n;
scanf("%lld",&n);
if(n==0) printf("0\n");
else {
int p=lower_bound(num,num+32,n)-num;
int res[35];
for(int i=0;i<=p;i++)
{
memset(res,0,sizeof(res));
LL sum=0;
sum+=1l*2*num[i];
res[i]=2;
//接着判断是否其余可以写成1和0的情况
LL k=1l*n-sum;
for(int j=p;j>i;j--)
{
if(num[j]<=k) {
k-=num[j];
res[j]=1;
}
}
if(k==0) {
bool flag=false;
for(int j=p;j>0;j--)
{
if(res[j]) flag=true;
if(res[j]==0&&!flag) continue;
if(flag) {
printf("%d",res[j]);
}
}
printf("\n");
}
}
}
}
return 0;
}