WC2017 Day1
WC2017 Day1
字符串算法
0x00 字符串的性質
- 字符串的周期(period):例如abcabca 周期為3
- 字符串的border :相同前后綴
- 顯然如果一個長為s字符串有長度為r的border,則其有長度為s-r的period
border有什么用?KMP
- 后綴數組:可以求兩個子串的最長公共前綴(LCP)
LCP和周期性:如果一個字符串有周期p,則i與i+p的LCP為s-p-i+1
- Weak Periodicity Lemma:p和q都是s的周期,p+q<=|s|,則gcd(p,q)也是s的周期
- Periodicity Lemma(周期引理):p和q都是s的周期,p+q-gcd(p,q)<=|s|,則gcd(p,q)也是s的周期
這兩個定理都十分顯然,弱化版可以先證p-q也是周期,然后輾轉相減,標準版不予證明
- 字符串匹配 引理:u,v滿足2|u|>=|v|,則u在v中所有匹配位置組成一個等差數列,用border的性質和周期引理可證
- border的結構:s所有不小于|s|/2的border長度構成等差數列,同樣用border性質和周期引理可證
把border按長度分類:[1,2),[2,4),[4,8)…….每一類里長度都是等差數列,則周期也有類似性質(這一個沒聽懂,下面所有涉及這個的都沒懂)
- 如果|v|>=|w|/2,|v|是2的冪次,且w,v都是s的子串,如何求v在w中的匹配位置?
可以用類似倍增求后綴數組的做法,把w中長度為|v|的拎出來排序
0x01 字符串循環移位
- 字符串的循環移位:一般有n種,如果最小周期p|n,則只有p種不同的循環移位,每種出現n/p次
- 循環同構?破環成鏈,在鏈上匹配(等差數列)
- 可以優化,需要用到上面沒聽懂的那個性質
0x02 回文串
- Manacher
回文樹
- 引理:s是回文串,s的后綴(前綴)t是回文串當且僅當t是s的border,用顯然法證明
推論:任意字符串所有回文后綴的長度是logn個等差數列(又是你!)
最小回文串拆分:manacher+dp,dp[i]=min{dp[j]+1,s[j..i]是回文串},復雜度O(N^2),可以用上面的推論優化成nlogn
- 判斷是否存在非平凡(l>=2)回文串拆分:顯然有個n^2 dp做法,和上面的問題一樣,然而存在線性做法
- 顯然的想法:維護從每個點出發的最短(>=2)回文串,貪心取最短串,嘗試證明:
- 設從一點出發實際段長為d,最短段長為f[i]
- 若f[i]>=d/2 可以找到一個更短的前綴回文串:d-f[i]是周期=>2(d-f[i])是周期=>d-2(d-f[i])是border=>d-2(d-f[i])是一個更短的前綴回文串,這里要特判d=2f[i]-1的情況
- 若f[i]i],f[i]+1..d-f[i],d-f[i]+1..d,都是回文串,這里要特判d=2f[i]+1的情況
單純貪心不太好使,三種情況,O(3)轉移dp
- 雙回文串:a,b都是回文串,則ab是一個雙回文串
- s=x1x2=y1y2=z1z2,如果y1,y2,x2,z1都是回文串,x1
- 判斷s能否拆成不超過4個回文串?
窮舉中間斷點,判斷前后能否用兩個以內的回文串組成,預處理。
0x03 字典序
- 全是后綴數組,沒怎么聽懂
Ulam 猜數游戲
0x00 內容
- 回答方選擇一個數x
- 詢問方詢問一個集合s,回答方回答x是否在s內
- 回答方可以撒謊不超過k次
- 回答方可以變更選擇的數(必須合法)
- 拓展:詢問必須事先確定(離線詢問)
0x01 策略
先考慮離線情況
提問方
樸素策略:每次詢問二進制位上的一位,每次詢問重復k+1次,最壞次數是$ \left ( k+1 \right ) \log_2{n}+1\(,對所有k和離線都適用,離線的話要詢問k+2次,最壞次數\)\left ( k+2 \right ) \log_2{n}$
- 0 1 2 3 4 5 6 7
- 1 3 5 7 倒數第一位為1?
- 2 3 6 7 倒數第二位為1?
- 4 5 6 7 倒數第三位位1?
問題轉化
- 傳輸一個長為$ log_2{n}$的01串,傳輸有噪音,有不超過k位被修改
- k=1的情況
- 算法0:樸素算法,每個位置詢問3次
- 算法1:每個位置詢問2次,加一個奇偶校驗,詢問最終01串中1的奇偶性
- 算法2:每個位置詢問1次,把詢問位置1到n標號,設立$ log_2(log_2{n}+1)$個奇偶校驗,第k個奇偶校驗用于檢查二進制位上第k位為1的位置構成的串的奇偶性,同時對整個串設一個奇偶校驗
- 算法3:hamming code
細化模型
- 是一個信道編碼問題
- 編碼 傳輸 譯碼
編碼要求:傳輸過程中受到噪聲影響仍能正確譯碼
等價于將n維空間中的$ 2^n$個點映射到m個點上
在線情況
- k=1時,離線與在線算法的最優解滿足:在線<=離線<=在線+1,我不會證
回答方的策略?
- 回答方有兩種選擇,將游戲引向兩種狀態
- 哪個狀態對詢問方更不利?信息熵(不確定性)更大的那個。
- 一個重要的評判策略:如果這個數是x,那回答方還能撒謊的次數p
- 記當前p為i的數有$ w_{i}\(個,W是\) w_{i}$的有序集合
- 一個狀態可以用W表示,開始時的狀態$ \left { n,0,0,0,0..... \right }$
- 詢問方可以直接得到答案的W滿足$ \sum wi=1$
如何維護W?
- 考慮回答者的視角,按一次詢問是否涉及一個數把W分成A詢問到,B沒詢問到兩個集合
- yes?相當于你對所有b撒謊了
- no?相當于你對所有a撒謊了
- 以yes為例,$ w_{i}=a_{i}+b_{i-1}$,相當于b被右移一位
如何量化信息熵?
設$ V_{q}\left(W\right)=\sum_{i}^{k}w_{i}\sum_{j}^{i}\binom{q}{j}$
- q表示在q次詢問內得出答案
- 此為估價函數(搜索空間的體積)
- 這個玩意取對數就是信息熵
感性認識:后面那個組合數就是撒謊方式的數量
Vq的性質
- $ V_{q}\left(W\right)=V_{q-1}\left(W_{yes}\right)+V_{q-1}\left(W_{no}\right)$
- $ V_{q}\left(W\right)\leqslant 2^q$是能在q次詢問內得出解的必要條件
根據第二條性質,可以用$ V_{q}$評價一個狀態
這就可以搞了,回答方根據這個估價函數決定回答策略
再回頭看詢問方的策略?
- 相當于n個數$ a_{i}$,分成兩堆,要求差最小
- 沒有多項式做法,可以貪心(論文《論一類啟發式算法在信息學競賽中的應用》)
0x02 Ulam游戲的實質
- k=1時,其實是容錯的二分搜索
- 如果$ k\neq 1$?
- 變成了一個k+1劃分問題
- 回答方:性質2變成$ V_{k,q}\left(W\right)=\sum_{i}^{k}wi\sum_{j}^{i}\left(k+1\right) \binom{q}{j}\leqslant k^q$
0x03 其他問題
有一堆球,其中有一個比其他球輕一些,要求只用一架天平,用最少的次數找出這個球
- 三叉搜索,要求其中兩個集合大小一樣
- 如果天平有不超過k次會出錯?
- 容錯三叉搜索問題
N個數,大小未知,比較器會有不超過e次出錯,用最少的比較次數求其中最大項
- 樸素策略,每次瘋狂詢問,直到一個返回值出現大于e+1次
- 理論復雜度(e+1)(n-1)+e
- 然而這是理論最優
- 構造一個回答策略,前(e+1)(n-1)-1次詢問如實回答
- 定義“負票”這個概念:如果比較器返回了a比b小,則稱a收到一張負票
- 顯然如果一個數收到e+1張負票,那這個數不可能是最大值
- 前面的一階段的詢問中顯然有一個$ x_{m}\(收到的負票小于等于e,且有一個數\) x_{n}$沒有收到負票
- 在后面的e個詢問中,運用撒謊不讓$ x_{m}$收到的負票超過e
- 最后詢問方無法確定$ x_{n}\(還是\) x_{m}$是最大值,需要再詢問一次,總數是(e+1)(n-1)+e
容錯排序,沒有重復元素,不考慮常數
- 隨便選一個$ nlog_2{n}\(比較排序,運用前面的思路可以得到一個\) enlog_2{n}$排序
- 考慮插入排序,平衡樹維護序列
- 插入時不考慮出錯問題
- 插入后和前驅后繼元素O(e)比較一下
- 最終復雜度$ O((n+e)log_2{n}+(n+e)e)$ log是插入,e是判錯
IOI2016 題解
練習賽前三題都是傻逼題,按下不表
練習賽T4
有一個01串S,你每次可以詢問一個01串是不是S的子串,最終要求輸出S
- 36分,貪心向后加01,不能加了以后向前加01,期望復雜度2n
- 100分:
- 做法1:貪心加01,但只詢問一次,如果連續詢問k次都不對,就認為長度過長了,在這個后綴里二分求出最長長度,k取15可過
- 做法2:確定性算法,先二分出最長全0串長度為l,向后加1并判斷,如果連續l+1個不合法就說明過長,復雜度貌似很大,實際是$ n+2log_2{n}$可過
D1T1
有n個數$ a_{i}\(,要求找出一個集合B使\) \sum bi \in [L,R]\(,滿足\) R-L>a_{max}-a_{min}$
- 從小到大排序,貪心往里加直到加不下,設當前加不進去的一個數是$ a_{k}\(,由于題目給出的性質,\) a_{k}-a_{1}\(肯定能加進去,那把\) a_{k}\(加進去,\) a_{1}$刪掉,繼續往后掃
- 答案一定是一個連續區間或者是前綴和+后綴和
- 做法多種多樣
D1T2
有一些鐵軌,每個鐵軌i要求進入速度不大于$ s_{i}\(,出來速度會變成\) t_{i}$,初始速度為1,你可以用1的代價使速度-1,要求最小化代價通過所有鐵軌,通過的順序任意安排
- Subtask3:判斷代價是否為0,對每個速度建一個點,初始速度為0,最終速度為INF,鐵軌看作邊,中間點補上向速度+1的邊,判斷0到INF是否聯通
歐拉路徑
100分,還用剛才的模型,現在可以用1的代價添加一條i到i-1的邊,現在唯一的問題是不聯通
現在可以用一定的代價使i到i+1聯通(離散化之后),最終的目標是是整個圖聯通,由于中間是歐拉路徑,等價于一個無向圖,這是什么東西?MST!
D1T3
一條鏈,每個點上額外掛一個點,每條邊有權,在兩個鏈上的點之間加一條邊長為c,要求最小化兩點間最短距離的最大值
- 二分答案,分類討論兩點與邊兩端的位置關系,轉化為對邊兩端的位置限制,two pointers搞一搞,枚舉限制關系可過3000
- 求限制關系的時候可以枚舉j,線段樹詢問i,可過300000
- two pointer優化尋找i,j限制,可A
D2T1
一個長為n黑白串,給出一些位置的顏色,并且順序給出所有k段極大連續黑色的長度,問哪些位置的顏色可以確定
- O(nk) DP,判斷每個位置是否能為黑/白,
- 白色很好判斷,掃一遍
- 黑色的話,窮舉k,前綴和打標記,開始+1末尾-1
D2T2
交互題,有個機器,支持輸入一個長度為n的01串,查詢是否存在一個長度為n的01串,這個機器會把你輸入的01串按照一個排列$ p_{1}p_{2}p_{3}p_{4}p_{5}...p_{n}$重排,求這個排列
- 分治,每次把區間二分,對左半區間內每個數i,構造一個數第i位為1,這個區間內其他數為0,區間外的數為1
- 復雜度$ nlog_2{n}$
D2T3
一個大正方形中有一些點,要求用不超過k個小正方形覆蓋這些點,小正方形的對角線必須在大正方形對角線上,最小化小正方形面積并
不妨把左下的關鍵點翻折到右上,并把無用的點刪除,則每個正方形會覆蓋一段連續的點,考慮dp,直接轉移是$ kn^2$,滿足決策單調性,斜率優化得kn
這種選取不超過k的dp,如果dp[n][k]是一個關于k的凸函數,可以用二分一個斜率去切這個函數,直到切點為k時即為答案,
這里可以二分每個小正方形的代價c,用c去切每個dp位置,最終復雜度為$ nlog_2{nk}$
BM算法
- 口音太重,啥都聽不懂
感想
- 冬眠營,掉線營
- 聽個頭啊
- 怎么口音這么重
轉載于:https://www.cnblogs.com/LoveYayoi/p/6745455.html
總結
以上是生活随笔為你收集整理的WC2017 Day1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ci框架——辅助函数
- 下一篇: C# 反射与dynamic最佳组合