HDU3336 KMP之next陣列妙用

2021-06-18 23:29:02 字數 1128 閱讀 6683

本題要求所給字串的字首在整個字串中出現的次數的累加和。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,這是乙個密碼表。然後給你乙個字串,這個字串是不完整的 完整的應該是前半部分是加密的,後半部分是解密了的 然而,給你的字串一定是加密的部分 一部分解密的部分 可以是全部,也可以是沒有 讓你求出最短的完整字串 解題思路 考慮...