题目
题意:构造两个字符串
s
s
s,
p
p
p,使
p
p
p在
s
s
s中作为子序列的出现次数恰好等于
n
n
n。
其中
n
≤
1000000
n≤1000000
n≤1000000;
s
s
s,
p
p
p的长度不能超过
200
200
200。
在构造过程中保证使
s
=
p
u
s=pu
s=pu
x
x
x为新字符
k
→
2
k
+
1
k→2k+1
k→2k+1 : 令
s
′
=
p
x
u
x
x
,
p
′
=
p
x
s′=pxuxx,p′=px
s′=pxuxx,p′=px(
s
′
s'
s′中含有
p
x
,
p
u
x
,
p
u
x
px,pux,pux
px,pux,pux)
k
→
2
k
+
2
k→2k+2
k→2k+2 : 令
s
′
=
p
x
x
u
x
x
,
p
′
=
p
x
s′=pxxuxx,p′=px
s′=pxxuxx,p′=px
#include<bits/stdc++.h>
using namespace std;
string p,s;
int n;
void dfs(int n,char c){
if (n==1){
s+=c,p+=c;
return;
}else if (n==2){
s+=c,s+=c,p+=c;
return;
}
if (n&1){
dfs(n/2,c+1);
s=p+c+s.substr(p.size(),s.size()-p.size()+1)+c+c,p+=c;
}else{
dfs(n/2-1,c+1);
s=p+c+c+s.substr(p.size(),s.size()-p.size()+1)+c+c,p+=c;
}
}
int main(){
scanf("%d",&n);
dfs(n,'a');
cout<<s<<' '<<p;
}