题目大意:
构造两个字符串
s,p
,使
p
在
其中
如果能做到从出现次数为k的方案转化到
2k+1
和
2k+2
,那么就能在
O(logn)
的时间内求出答案。
在构造过程中保证使
s=pu
。
- k→2k+1 : 令 s′=pxuxx , p′=px ,其中 x 为未出现过的字符。
k→2k+2 : 令 s′=pxxuxx , p′=px ,其中 x <script type="math/tex" id="MathJax-Element-1298">x</script>为未出现过的字符。
递归构造就可以了。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct Node{
Node(){}
Node(string s,string p):s(s),p(p){}
string s,p;
}a;
int i,j,k,n,m;
char c;
inline Node Solve(int n){
Node Tmp;
if(n==1){
c='a';
return Node("a","a");
}
if(n==2){
c='b';
return Node("abb","ab");
}
if(n%2==0){
Tmp=Solve(n/2-1);
c++;
Tmp.s.insert((int)Tmp.p.size(),string(2,c));
Tmp.s+=string(2,c);
Tmp.p+=string(1,c);
return Tmp;
}
Tmp=Solve(n/2);
c++;
Tmp.s.insert((int)Tmp.p.size(),string(1,c));
Tmp.s+=string(2,c);
Tmp.p+=string(1,c);
return Tmp;
}
int main(){
scanf("%d",&n);
a=Solve(n);
for(i=0;i<a.s.size();i++)putchar(a.s[i]);putchar(' ');
for(i=0;i<a.p.size();i++)putchar(a.p[i]);puts("");
return 0;
}