打字機 線性遞推

2021-09-27 07:37:05 字數 1856 閱讀 5811

打字機

本題看起來很不好做,但仔細畫畫圖找找規律之後還是能找出規律的

——————————————————————————————————————————————

現在已知以s[i

]s[i]

s[i]

結尾的答案sum

[i

]sum[i]

sum[i]

和總答案,

這時候乙個準備加進答案的dot

h[j]

doth[j]

doth[j

]那麼我們發現,總答案的兩倍減去sum

[i

]sum[i]

sum[i]

證明:原來的答案中有以dot

h[j]

結尾的,

也有不以

doth

[j]結

尾的,因

為每個字

母都有可

能沒打到

,則有s

um[d

oth[

j]]個

不以do

th[j

]結尾的

,即do

th[j

]沒打到

。而這時

候在所有

的方案後

加上do

th[i

],因為

有可能打

到,也有

可能沒打

到,所以

乘2,而

又因為s

um[d

oth[

j]]個

答案已算

過,所以

應減

去doth[j]結尾的,也有不以doth[j]結尾的,因為每個字母都有可能沒打到,則有sum[doth[j]]個不以doth[j]結尾的,即doth[j]沒打到。而這時候在所有的方案後加上doth[i],因為有可能打到,也有可能沒打到,所以乘2,而又因為sum[doth[j]]個答案已算過,所以應減去

doth[j

]結尾的

,也有不

以dot

h[j]

結尾的,

因為每個

字母都有

可能沒打

到,則有

sum[

doth

[j]]

個不以d

oth[

j]結尾

的,即d

oth[

j]沒打

到。而這

時候在所

有的方案

後加上d

oth[

i],因

為有可能

打到,也

有可能沒

打到,所

以乘2,

而又因為

sum[

doth

[j]]

個答案已

算過,所

以應減去

遇到退格,

if

(cnt)

因為在doth中加字母實際上就是沒達到字母的方案,已經算過,所以不用管,而原陣列中的s[i]是沒算過的,所以要加1,而因為退格會對後面貢獻新的方案,所以sum要+1

#include

using

namespace std;

const

int n=

5000010

,mod=

0x125e591

;char s[n]

,doth[n]

;int n,m,sum[n]

;int

main()

else}}

printf

("%lld"

,ans)

;}

高階打字機

早苗入手了最新的高階打字機。最 自然有著與以往不同的功能,那就是它具備撤銷功能,厲害吧。請為這種高階打字機設計乙個程式,支援如下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 ...