高階打字機

2022-05-15 17:01:39 字數 2249 閱讀 9783

【題目描述】

早苗入手了最新的高階打字機。最**自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。

請為這種高階打字機設計乙個程式,支援如下3種操作:

2.u x:撤銷最後的x次修改操作。(undo操作)

(注意query操作並不算修改操作)

文章一開始可以視為空串。

【輸入格式】

第1行:乙個整數n,表示運算元量。

以下n行,每行乙個命令。保證輸入的命令合法。

【輸出格式】

每行輸出乙個字母,表示query操作的答案。

【樣例輸入】

t at b

t cq 2

u 2t c

q 2【樣例輸出】bc

【資料範圍】

對於40%的資料 n<=200;

對於100%的資料 n<=100000;保證undo操作不會撤銷undo操作。

《高階挑戰》

對於200%的資料 n<=100000;undo操作可以撤銷undo操作。

題解:

因為undo操作只能撤銷type操作,所以undo x 實際上就是刪除文章末尾x個字母。用乙個棧即可解決(每個字母最多進出一次)。

《高階挑戰》    (考慮到部分選手水平較高,故設此附加題)

本題雖為2023年ioi的題目,但只要使用離線演算法,就成為只需noip級別程式設計水平的題目了。

以下宣告一些定義:(對於此類題目以及各種可持久化資料結構的離線解法的思考很有幫助)

版本:接受第1--i個修改操作(包含type和undo)後的狀態稱為版本i。版本0為初始狀態。

版本鏈:一般的資料結構題目只有各種修改命令(比如本題的type操作),那麼所有版本就會呈鏈狀排列。

這種情況下只需要設計乙個合理的資料結構依次執行操作即可。

版本樹:undo x撤銷最近的x次修改操作,實際上就是當前版本還原為x次操作前的版本,換句話說,版本i = 版本i-x-1。

如圖所示,所有版本呈樹狀排列,版本0為根。

讀入所有操作並建樹,對這顆版本樹按尤拉序求出所有版本。上圖中就是按0->1->4...4->1->0->2->3->2->0的順序遍歷,同樣使用棧就能計算出所有的版本,然後在對應的版本上解決詢問即可。

到此,就得到了時空複雜度均為o(n)的離線演算法。

能解決這類題目的條件是:

1.允許使用離線演算法,進而求出版本樹,並允許把詢問掛到樹的節點上。

2.所有操作都是可逆的。只有所有操作都是可逆的,才能按尤拉序依次求出各版本。如本題的type操作的逆操作就是彈出棧頂,undo操作則根本不需要修改(undo前後2個版本相同)。

trie+倍增法尋祖                                       o(nlogn)

各種可持久化資料結構:可持久化塊狀陣列                o(nsqrtn)

可持久化跳表(與trie解法相近) o(nlogn)

因超出noip範圍不做更多展開。

以下為200%**:

#include#include

using

namespace

std;

#define n 10000100

introot[n],len[n],lc[n],rc[n],tot;

char s[n*2

];inline

void ins(int &y,int x,int l,int r,int pos,char

c)

else

}inline

void query(int y,int l,int r,int

pos)

else

}int

main()

else

if(cmd[0]=='u'

)

else scanf("

%d",&x),query(root[cnt],lm,rm,x);

}return0;

}

view code

高階打字機

早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 t x 在文章末尾打下乙個小寫字母x。type操作 u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 q x 詢問當前文章中第x個字...

高階打字機

題目描述 請為一種高階打字機設計乙個程式,支援如下3種操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 文章一開始可以視為空串。輸入描述 第1行 乙個整數n,表示運算元量。以下n行,每行乙個命令。保證輸入的命令合法。輸出描述 每行輸出乙個字母,表示query操...

高階打字機

題目描述 早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下3種操作 1.t x 在文章末尾打下乙個小寫字母x。type操作 2.u x 撤銷最後的x次修改操作。undo操作 注意query操作並不算修改操作 3.q x ...