[2018.10.18 T3] 玩串

暫無鏈接

玩串

【問題描述】

艾奇非常喜歡玩串。
艾奇覺得,字符串什麼的非常優美。她會有事沒事地給一個字符串數它有多
少個好的非空子序列。
一個好的子序列,滿足它是SSSS的形式。
比如說,abcabcabcabc就是好的,而23332333就不是好的。
衆所周知,一個字符串的子序列有22的長度次方個,而好的字符串長度一定是偶數。
而一個字符串的權值,就是本質不同的好的子序列的個數。
兩個子序列本質不同,當且僅當它們之中任意一個字符所處的位置不同。
(以上大家應該都知道吧)
一天,艾奇數着數累了,她想知道對於一個權值xx,你能否找到這樣一個字符串呢?
當然,本題可能有多個滿足條件的解,你只需要輸出任何一個即可。
當然我不可能讓你隨意輸出對吧,不然這題還做個球。
任何情況下,字符串的長度不能超過100100,字符集大小不能超過5050
就這麼簡單。

【輸入格式】

輸入文件名爲fkstring.infkstring.in
一行一個整數,表示你輸出的串需要包含的權值。

【輸出格式】

輸出文件名爲fkstring.outfkstring.out
第一行一個數nn,表示你輸出字符串的長度。
第二行nn個數,表示你輸出的滿足要求的串。

【輸入樣例 1】

詳見fkstring1.infkstring1.in

【輸出樣例 1】

詳見fkstring1.outfkstring1.out

【數據範圍】

TIM截圖20181018190604.png

【備註】

下發的樣例輸出文件,只是供作參考,表示一種合法的字符串。
字符串的輸出形式,你需要輸出一行不超過100100個數。每個數的大小不超過 5050。每個
數表示一個對應的字符。不同的數字代表不同的字符。

題解

我們考慮上空串,先讓n+1n+1,答案初始爲空,價值爲11,設整個串由兩部分S1,S2S_1,S_2構成,其中S1S_11,2, ,k1,2,\cdots,k,我們可以由下面兩個操作更改整個串的價值:

價值加一:S1,S2S1,k+1,k+1,S2S_1,S_2 \to S_1,k+1,k+1,S_2

價值乘二:S1,S2S1,k+1,S2,k+1S_1,S_2\to S_1,k+1,S_2,k+1

然後就做完了。。。

代碼
#include<bits/stdc++.h>
using namespace std;
deque<int>dui;
int n,tot,bit[30],top,i;
void in(){scanf("%d",&n);}
void ac()
{
	for(++n;n;n>>=1)bit[++top]=n&1;
	for(dui.push_front(++tot),i=top-1;i;--i,dui.push_back(++tot))if(bit[i]&1)dui.push_front(++tot);
	printf("%d\n",tot-1<<1);for(i=1;i<tot;++i)printf("%d ",i);for(;dui.size()>1;dui.pop_front())printf("%d ",dui.front());
}
int main(){in(),ac();}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章