3023. 字符组合

徐摆渡

参考了学长的思路,顺带学习了一下二进制枚举

#include <bits/stdc++.h>
using namespace std;

int T, cnt;
char str[20];
struct data
{
    char ans[100];
}d[1<<17];

bool cmp(data x, data y)
{
    return strcmp(x.ans,y.ans)<0;
}
int main()
{
    cin>>T;
    char ch=getchar();
    while(T--){
        gets(str);
        int len=strlen(str);

        //排序去重
        sort(str,str+len);
        int len1=1;
        for(int i=0, j=0;j<len;++j)
            if(str[j]!=str[i]) {str[++i]=str[j];len1++;}
        str[len1]='\0';

        //二进制枚举
        int len2=(1<<len1);
        for(int i=1;i<len2;++i){//从1开始空集不考虑
            int l=0;
            for(int j=0;j<len1;++j)
                if(i & (1 << j)) d[i-1].ans[l++]=str[j];
            d[i-1].ans[l]='\0';
        }

        //每个组合按字典序排好后输出
        sort(d,d+len2-1,cmp);
        printf("case #%d:\n",cnt++);
        for(int i=0;i<len2-1;++i)
            printf("%s\n",d[i].ans);
        memset(str,0,sizeof(str));
        memset(d,0,sizeof(d));
    }
    return 0;
}
Mrhuo

用了类似深度优先想法,用一个递归函数从当前step到最后一个字母循环递归,用vector来储存要输出的字符串。

include

include

include

using namespace std;
list arr;
void print(string a,int step);

int cmp(char a,char b)
{
if(a>T;
int cixu=0;
while(T–)
{
string b;
cin>>b;
string a;
for(int i=0;i::iterator it=arr.begin();it!=arr.end();it++)
{
cout<<*it;
}
cout<<endl;
print(a,i+1);
arr.pop_back();
}
}
}

10165101161

首先把字符去重排序,然后学会二进制枚举每个字符取不取,最后字典序排序
哈哈 我也第一反应是这个

Li Dao

首先把字符去重排序,然后学会二进制枚举每个字符取不取,最后字典序排序

include

using namespace std;
int T;
vector V;
vector ans;
void solve()
{
string strs;
cin>>strs;
int ll=strs.length();
V.clear();
for(int i=0;i<ll;i++) V.push_back(strs[i]);
sort(V.begin(),V.end());
V.resize(unique(V.begin(),V.end())-V.begin());

ll=V.size();
ans.clear();
for(int i=1;i<=(1<>=1;
}
//cout<<now<<endl;
ans.push_back(now);
}
sort(ans.begin(),ans.end());
for(int i=0;i<ans.size();i++) cout<<ans[i]<<endl;

}
int main()
{
scanf(“%d”,&T);
for(int step=0;step<T;step++)
{
printf(“case #%d:\n”,step);
solve();
}
return 0;
}

你当前正在回复 博客/题目
存在问题!