【GDOI 2016模擬3.9】暴走的圖靈機

題目描述

你有lr 兩個字符串,初始l="0",r="1" ,每輪操作定義如下。

  • r 變成原來的l+ 原來的r ,這裏的+ 表示將兩個字符串連接起來
  • l 變成原來的l

給定一個長度爲m 的匹配串s ,問操作n 次後,l 中包含了多少個s 作爲子串,答案對p 取模。

n109,m104,0<p109


分析

類似於斐波那契數的斐波那契串,名字是我隨便取的。
考慮某輪操作完得到的新串S ,有S=l+r
那麼S 所包含的匹配串數(記爲VS ),有VS=Vl+Vr+C
其中C 表示跨過l,r 分界線的匹配串數。
那麼問題就變成如何求C
實際上考慮匹配串長度只有104 ,我們只要保留l 串的後m1 位,以及r 串的前m1 位,將它們拼在一起做一次KMP就可以的得到了。

但是這裏n 很大。
考慮假如不存在C ,求這個東西可以用矩陣乘法。
這裏存在C 了,但是當lr 的長度超過2m2 時,兩者的前m1 個字符和後m1 個字符就基本不會變了(只會有四組可能的字符)。
於是我們先暴力算lr ,直到它們兩者的長度都至少爲2m2
那麼這裏只需要找到循環節,算出循環那麼多次的轉移矩陣,利用矩陣乘法求出Vln 就可以了。

時間複雜度O(km+33logn) ,其中k 是滿足fibk2m2 最小的一個。
空間複雜度O(m)

發佈了114 篇原創文章 · 獲贊 4 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章