Count the string[KMP]HDU3336
阿新 • • 發佈:2019-08-29
題庫連結http://acm.hdu.edu.cn/showproblem.php?pid=3336
這道題是KMP的next陣列的一個簡單使用,首先要理解next陣列的現實意義:next[i]表示模式串的前i個字元所組成的字串的最長字首字尾匹配長度,就比如對於字串"abcdabe",它的next[3]=0,因為前三個字元構成的字元子串"abc"前後綴最長匹配長度為0,而next[6]=2,因為對於子串"abcdab",它的字首字尾最大可以匹配出"ab",長度為2,對應了它的字首字尾最大匹配長度。
對於這道題,我們從1位置開始遍歷整個next陣列,首先每一個字首串自身都對答案有1的貢獻,所以首先ans++,此外,當與到next[i]數值大於0的位置,說明前i個字元組成的子串有大於零的字首字尾匹配,即字首串在該位置重複出現了一次,所以此時ans再加1。
詳見程式碼:
#include<bits/stdc++.h> using namespace std; char s[200010]; int t,n,nex[200010]; int ans; void getNex(){ nex[0]=-1; int k=-1,j=0; while(j<n){ if(k==-1||s[j]==s[k]){ ++j;++k; nex[j]=k; } else k=nex[k]; } } int main(){ scanf("%d",&t); while(t--){ ans=0; scanf("%d%s",&n,s); getNex(); for(int i=1;i<=n;i++){ ans++; if(nex[i]!=0) ans++; ans%=10007; } printf("%d\n",ans); } return 0; }