本題要求所給字串的字首在整個字串中出現的次數的累加和。kmp演算法的運用。
容易聯想到kmp演算法中的next陣列,當next[i]>0時可以理解為i前面的next個字元組成的字串對應乙個字首。此外長度為n的字串有n個字首。
所以res等於n加上所有next值大於0的元素的個數。
例如:abab
那麼他的字首有a , ab ,aba , abab。
對應的在原串中的個數為a有2個,ab有2個,aba有1個,abab有1個。
那麼總數是6。
思路:對這個字串求出next陣列,那麼對於每個next[i] = k ,那麼我們就知道字首0 -> k - 1處有乙個匹配。那麼累加即可。
那麼只需根據next陣列匹配成功的個數進行累加即可。
/**********************
* author:crazy_石頭
* pro:hdoj 3336
* algorithm: kmp
* judge status:accepted
* memory:1246k
* time:46ms
* date:2013/11/01
***********************/
#include
#include
#include
#include
usingnamespacestd;
#define rep(i,h,n) for(int i=(h);i<=(n);i++)
const
int maxn=200000+5;
int next[maxn];
char p[maxn];
int n,test;//主串的串長;
inlinevoid getnext(char *p,int *next)
}int main()
printf("%d\n",res);
}return0;}
* this source code was highlighted byycdoit
. ( style: friend )
HDU 3336KMP性質簡單應用
題意 首先給個t 有幾組測試資料 對於每個測試資料 給乙個數字m為串的長度,給一串m個字元長度的串 求 對於串的每乙個字首,其在串中出現次數的總和並mod10007 在這裡出錯了 題目給了乙個例子 對於4長度的串abab 有 a ab aba abab 共四個字首 a 出現了2次,ab 2,aba ...
hdu3336解題報告
題目大意 有乙個長度為n的字串,理所當然它有n個字首,問將這個n個字首都拿去匹配,會匹配出來多少個,總數模10007。解題思路 最簡單的應該就是a自動機,多模板匹配,其實這個題的字首樹是一條直線。還有一種,就是kmp演算法,不用完整的kmp演算法,在建立失配表的時候就要開始統計,因為建立失配表的時候...
hdu 4300(kmp或者拓展kmp)
題意 亂七八糟說了一大堆,就是先給你乙個長度26的字串,對應了abcd.xyz,這是乙個密碼表。然後給你乙個字串,這個字串是不完整的 完整的應該是前半部分是加密的,後半部分是解密了的 然而,給你的字串一定是加密的部分 一部分解密的部分 可以是全部,也可以是沒有 讓你求出最短的完整字串 解題思路 考慮...