Panasonic Programming Contest 2020 D - String Equivalence
题意
本来是求字母的序列转化为求数字的序列,最后可以再转化为字母。
转化为求一个序列,如果这个位置是 p[i],那么 1~i-1 内一定出现过所有 1~p[i]-1 的数字,且第i个位置能取的最大数字为之前所用到的最大数字+1。
思路
序列要想到DFS
字母序列可以转化为数字序列 最后输出的时候再转换回来即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const ll maxn = 1e6 + 5;
int n,a[100];
void dfs(int p,int lim){
if(p==n+1){
for(int i=1;i<=n;i++){
cout<<char(a[i]+'a'-1);
}
cout<<endl;
return;
}
for(int i=1;i<=lim;i++){
a[p]=i;
dfs(p+1,lim+(i==lim));
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
dfs(1,1);
return 0;
}