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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Detection of Extraterrestrial KMP匹配 重复k次子串 好题

發布時間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Detection of Extraterrestrial KMP匹配 重复k次子串 好题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一開始以為這道題是后綴數組,想了好久沒想明白怎么做,后來發現暴力枚舉起點,進行KMP就好了。

枚舉起點以后,構建fail數組。

遍歷fail數組,如果串s[l,r]是由串s[s,t]重復k次得到的,那么fail數組的樣子一定如下

index: [l] [l+1] [l+2] ....[t] [t+1] [t+2]....[r]

? ? fail: [0] [*]? ?[*]? ? ?...[*] [1] [2] [3] ....[r-t]

并且(r-l+1)一定是(t-s+1)的倍數。

len = r-l+1

如果len > ans[k],記把ans數組k的位置更新成len。

這樣的話我們在輸出答案的時候,要輸出重復t次的最長串長度,那么答案一定是ans[t],ans[2t]...ans[kt]里面的最大值

因為重復2t次也可以看作是重復t次,相鄰的2個合成1個來看。

時間復雜度

O(n*n+n+nlogn)=O(n2)


#include <bits/stdc++.h> using namespace std; #define MAXN 2000001 const int maxn = 1005; char str[maxn]; char *s; int fail[maxn]; int ans[maxn]; void make_fail() {for (int i = 1, j = 0; s[i]; i++){while (j && s[i] != s[j])j = fail[j - 1];if (s[i] == s[j])fail[i] = ++j;else fail[i] = 0;} } int cas = 0; void solve(){memset(ans,0,sizeof(ans));int len = strlen(str);int pre = -1;for(int i = 0;i < len;i++){s = str+i;make_fail();for(int j = 0;s[j];j++){if(fail[j] == pre + 1){pre++;if(pre >= 1 && (j+1)%(j+1-pre) == 0){ans[(j+1)/(j+1-pre)] = max(ans[(j+1)/(j+1-pre)],j+1);}}else if(fail[j] < pre){pre = 0;}}}/*for(int i = 0;i < len;++i){cout<<ans[i]<<endl;}*/printf("Case #%d: %d",++cas,len);for(int i = 2;i <= len;i++){int pt = 0;for(int j = i;j <= len;j += i){pt = max(pt,ans[j]);}printf(" %d",pt);}puts(""); } int main(){int T = 1;cin>>T;while(T--){cin>>str;solve();}return 0; }



總結

以上是生活随笔為你收集整理的Detection of Extraterrestrial KMP匹配 重复k次子串 好题的全部內容,希望文章能夠幫你解決所遇到的問題。

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