Codeforces 802H. Fake News (medium)

题目
题意:构造两个字符串 s s s p p p,使 p p p s s s中作为子序列的出现次数恰好等于 n n n
其中 n ≤ 1000000 n≤1000000 n1000000 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 k2k+1 : 令 s ′ = p x u x x , p ′ = p x s′=pxuxx,p′=px s=pxuxxp=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 k2k+2 : 令 s ′ = p x x u x x , p ′ = p x s′=pxxuxx,p′=px s=pxxuxxp=px

#include
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;
}

你可能感兴趣的:(cf,构造,思维)