這道題和poj2778類似都需要利用end陣列和next陣列的特性構建狀態陣列,不過這裡是需要經過至少乙個目標串,而且長度是不小於l的,即需要長度為1~l時的種數和。然後我們可以求出總數後減去不經過目標串的和,剩下的就是我們要的答案。設總數的陣列為f[n],當n為1時答案為26,n為2時為26+26^2,即f[n]=(f[n-1]+1)*26;由於n等於l小於2^31,所以一樣用矩陣快速冪求出再減去不經過目標串的1~l的和。而這個和可以在矩陣上再增加一維就可以解決和的問題了。**如下
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int mod=
100000
;struct
matrix
matrix
(int _n)
matrix
operator
*(const
matrix
&b)const};
matrix
pow_m
(matrix
a,int n)
return ret;
}struct
tree
void
init
()int
judge
(char c)
void
insert
(char
*s) end[p]++;
}void
build()}
while
(!q.
empty
())else}}
}int used[
1010
];void
query
(char
*s,int n)
temp=fail[temp];}}
}matrix
getmatrix
()void
debug()}
};tree
ac;char str[
20];
intmain
() ac.
build
();matrix
a=ac.
getmatrix
(); a=
pow_m
(a,l);
matrixb(
2);b.mat[0][
0]=26;
b.mat[1][
1]=b.mat[1][
0]=1;
b=pow_m
(b,l);
unsigned
long
long ans=
0,res=0;
res+=b.mat[0][
0]+b.mat[1][
0];for(
int i=
0;i;i++)
cout<}}
hdu 2243 考研路茫茫 單詞情結
hdoj 2243 不僅僅是考研路茫茫 a此題的過程也是路茫茫 終於到最後柳暗花明了 a這個題用了3天 或者說用了1個月 因為1個月前就學了kmp和ac自動機 雖然上個月那節課學了kmp匹配演算法 字典樹 ac自動機。當時就聽得一頭霧水 特別是kmp那個失敗指標 或者說成是next fail.有那麼...
hdu 2243 考研路茫茫 單詞情結
題目大意 問長度為1 n的串中包含了模式串的串總共有幾個。題目思路 求出長度不大於l的包含模式串的字串數,方法是改求不包含模式串的字串總數,當然先要處理出總的字串個數,可以用矩陣也可以用二分冪和的方法。而求不包含模式串的字串數同樣是構造矩陣,同時還要建立乙個虛結點,儲存長度小於l的不包含模式串的字串...
HDU2243 考研路茫茫 單詞情結
傳送門 to hdu 傳送門 to vj 考慮一位一位的加入字元,我們只在乎當前字串末尾的匹配情況。既然如此,我們用 acac ac自動機上的乙個節點來表示狀態就可以了。現在是乙個 dpdp dp轉移。似乎要儲存是否曾經出現過詞根?其實不用,只需要用所有情況減去一次都沒有出現過的情況即可。向量中加入...