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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

HDU 3374 String Problem (KMP+最大最小表示)

發布時間:2025/6/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HDU 3374 String Problem (KMP+最大最小表示) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

KMP,在有循環節的前提下: 循環節 t = len-next[len], 個數num = len/(len-next[len]);個人理解,如果有循環節,循環節長度必定小于等于len/2, 換句話說next[len]>=len/2;對于len%(len-next)!=0的這種情況不討論,循環節不存在。下面是假設循環節存在的情況當次數等于2, 對于abcabc這種情況就不用說了,len = 6, next[len] = 3;當次數大于2,對于串a1 a2 a3 a4 a5 a6 a7 a8 a9如果有a1 a2 a3 a4 a5 a6 a4 a5 a6 a7 a8 a9next[len] = 6, len = 9;?說明a7 a8 a9 = a4 a5 a6; a1 a2 a3 = a4 a5 a6;循環節就很明顯了,其它情況也是類似與這樣討論。所以。。。。。view code#include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int N = 1e6+10; char s[N]; int next[N];void getnext(char *s, int *next, int len) {int j=0, i=1;next[1] = 0;while(i<len){if(j==0 || s[i]==s[j]) next[++i] = ++j;else j = next[j];} }int getsub(char *s, bool flag, int len) {int i = 0, j = 1, k = 0;while(i<len && j<len && k<len){if(i==j) j++;int ni = i+k, nj = j+k;if(ni>=len) ni -= len;if(nj>=len) nj -= len;if(s[ni]>s[nj]){if(flag) i += k+1;else j += k+1;k = 0;}else if(s[ni]<s[nj]){if(flag) j+= k+1;else i+= k+1;k = 0;}else k++;}return i; }int main() {while(scanf("%s", s)>0){int len = strlen(s);getnext(s, next, len);int t = len-next[len];t = (len%t?1:len/t);int minsub = getsub(s, true, len)+1;int maxsub = getsub(s, false, len)+1;printf("%d %d %d %d\n",minsub, t, maxsub, t);} }

轉載于:https://www.cnblogs.com/zyx1314/p/3896582.html

總結

以上是生活随笔為你收集整理的HDU 3374 String Problem (KMP+最大最小表示)的全部內容,希望文章能夠幫你解決所遇到的問題。

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