日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

P3426-[POI2005]SZA-Template【KMP】

發布時間:2023/12/3 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3426-[POI2005]SZA-Template【KMP】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3426


題目大意

給出一個長度為nnn的字符串sss,求一個長度最小的字符串ttt使得sss所有tttttt匹配的位置能覆蓋串sss

1≤n≤5×1051\leq n\leq 5\times 10^51n5×105


解題思路

首先答案肯定是原串的一個borderborderborder,設fif_ifi?表示前綴s1~is_{1\sim i}s1i?的答案。

考慮如何轉移,首先fif_ifi?至多是iii,然后考慮如果有一個串ttt能夠覆蓋s1~nxtis_{1\sim nxt_i}s1nxti??那么才有可能能覆蓋s1~is_{1\sim i}s1i?。(因為如果覆蓋大于nxtinxt_inxti?顯然不可能覆蓋整個串,不然就至少需要覆蓋到s1~nxtis_{1\sim nxt_i}s1nxti??)。

考慮什么時候fif_ifi?能夠取到fnxtif_{nxt_i}fnxti??。首先我們可以表示出s1,nxtis_{1,nxt_i}s1,nxti??假設我們上次覆蓋的位置是j∈[nxti,i]j\in[nxt_i,i]j[nxti?,i],那么需要有fj=fnxtif_{j}=f_{nxt_i}fj?=fnxti??(即取到同一個borderborderborder),然后要求j≥i?nxtij\geq i-nxt_iji?nxti?(這樣就可以用s1,nxtis_{1,nxt_i}s1,nxti??覆蓋剩下的)。

時間復雜度O(n)O(n)O(n)


code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=5e5+10; int n,f[N],nxt[N],ls[N]; char s[N]; int main() {scanf("%s",s+1);n=strlen(s+1);for(int i=2,j=0;i<=n;i++){while(j&&s[j+1]!=s[i])j=nxt[j];j+=(s[i]==s[j+1]);nxt[i]=j;}for(int i=1;i<=n;i++){f[i]=i;if(i-ls[f[nxt[i]]]<=nxt[i])f[i]=f[nxt[i]];ls[f[i]]=i;}printf("%d\n",f[n]);return 0; }

總結

以上是生活随笔為你收集整理的P3426-[POI2005]SZA-Template【KMP】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。