HDU 3374 String Problem (KMP+最大最小表示)
生活随笔
收集整理的這篇文章主要介紹了
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+最大最小表示)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何评估自己对外界认知是否正确?
- 下一篇: 8条腾讯的产品管理方式