多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > php教程 > hdu2243 ac自動機+矩陣連乘

hdu2243 ac自動機+矩陣連乘

來源:程序員人生   發布時間:2015-05-21 08:45:08 閱讀次數:3848次

http://acm.hdu.edu.cn/showproblem.php?pid=2243

Problem Description
背單詞,始終是溫習英語的重要環節。在荒廢了3年大學生涯后,Lele也終究要開始背單詞了。
1天,Lele在某本單詞書上看到了1個根據詞根來背單詞的方法。比如"ab",放在單詞前1般表示"相反,變壞,離去"等。

因而Lele想,如果背了N個詞根,那這些詞根到底會不會在單詞里出現呢。更確切的描寫是:長度不超過L,只由小寫字母組成的,最少包括1個詞根的單詞,1共可能有多少個呢?這里就不斟酌單詞是不是有實際意義。

比如1共有2個詞根 aa 和 ab ,則可能存在104個長度不超過3的單詞,分別為
(2個) aa,ab,
(26個)aaa,aab,aac...aaz,
(26個)aba,abb,abc...abz,
(25個)baa,caa,daa...zaa,
(25個)bab,cab,dab...zab。

這個只是很小的情況。而對其他復雜點的情況,Lele實在是數不出來了,現在就請你幫幫他。
 

Input
本題目包括多組數據,請處理到文件結束。
每組數據占兩行。
第1行有兩個正整數N和L。(0<N<6,0<L<2^31)
第2行有N個詞根,每一個詞根僅由小寫字母組成,長度不超過5。兩個詞根中間用1個空格分隔開。
 

Output
對每組數據,請在1行里輸出1共可能的單詞數目。
由于結果可能非常巨大,你只需要輸出單詞總數模2^64的值。
 

Sample Input
2 3 aa ab 1 2 a
 

Sample Output
104 52
 

/*** hdu2243 ac自動機+矩陣連乘 題目大意:給定n個單詞,求長度不大于m的字符串中所有含給訂單詞的字符串的個數 解題思路:利用ac自動機可以夠造出矩陣,矩陣的幾次冪就能夠統計長度為多少的所有不含模式串的字符串的個數。然后,矩陣加1列,并給該列的數全部賦1, 就能夠在轉移進程中統計出前綴和(很奇妙的)。然后用總的個數減去所有不含模式串的就是所有含模式串的。總的個數求法見代碼注釋。個數需要 對2^64取余,直接定義unsigned long long 讓其自然溢出就能夠了 */ #include <stdio.h> #include <string.h> #include <algorithm> #include <queue> #include <iostream> using namespace std; typedef unsigned long long ULL; struct Matrix///構造矩陣 { ULL mat[40][40]; int n; Matrix() {} Matrix(int _n) { n=_n; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { mat[i][j]=0; } } } Matrix operator *(const Matrix &b)const { Matrix ret=Matrix(n); for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { for(int k=0; k<n; k++) { ret.mat[i][j]+=mat[i][k]*b.mat[k][j]; } } } return ret; } }; ULL pow_m(ULL a,int n)///快速冪 { ULL ret=1; ULL tmp=a; while(n) { if(n&1)ret*=tmp; tmp*=tmp; n>>=1; } return ret; } Matrix pow_M(Matrix a,int n)///矩陣快速冪 { Matrix ret=Matrix(a.n); for(int i=0; i<a.n; i++) { ret.mat[i][i]=1; } Matrix tmp=a; while(n) { if(n&1)ret=ret*tmp; tmp=tmp*tmp; n>>=1; } return ret; } struct Trie { int next[40][26],fail[40]; bool end[40]; int root,L; int newnode() { for(int i=0; i<26; i++) next[L][i]=⑴; end[L++]=false; return L⑴; } void init() { L=0; root=newnode(); } void insert(char *buf) { int len=strlen(buf); int now=root; for(int i=0; i<len; i++) { if(next[now][buf[i]-'a']==⑴) next[now][buf[i]-'a']=newnode(); now=next[now][buf[i]-'a']; } end[now]=true; } void build() { queue<int>Q; fail[root]=root; for(int i=0; i<26; i++) { if(next[root][i]==⑴) { next[root][i]=root; } else { fail[next[root][i]]=root; Q.push(next[root][i]); } } while(!Q.empty()) { int now=Q.front(); Q.pop(); if(end[fail[now]])end[now]=true; for(int i=0; i<26; i++) { if(next[now][i]==⑴) { next[now][i]=next[fail[now]][i]; } else { fail[next[now][i]]=next[fail[now]][i]; Q.push(next[now][i]); } } } } Matrix getMatrix()///取得狀態轉移矩陣,加1列,每次相乘可以求前面所有數的和mat[0][L+1] { Matrix ret=Matrix(L+1); for(int i=0; i<L; i++) { for(int j=0; j<26; j++) { if(end[next[i][j]]==false) ret.mat[i][next[i][j]]++; } } for(int i=0; i<L+1; i++) { ret.mat[i][L]=1; } return ret; } } ac; char buf[10]; int main() { int n,L; while(~scanf("%d%d",&n,&L)) { ac.init(); for(int i=0; i<n; i++) { scanf("%s",buf); ac.insert(buf); } ac.build(); Matrix a=ac.getMatrix(); a=pow_M(a,L); ULL res=0; for(int i=0; i<a.n; i++) { res+=a.mat[0][i]; } res--; /* * f[n]=1 + 26^1 + 26^2 +...26^n * f[n]=26*f[n⑴]+1 * {f[n] 1} = {f[n⑴] 1}[26 0; 1 1] * 數是f[L]⑴; * 此題的L<2^31.矩陣的冪不能是L+1次,否則就超時了 */ a=Matrix(2); a.mat[0][0]=26; a.mat[1][0]=a.mat[1][1]=1; a=pow_M(a,L); ULL ans=a.mat[1][0]+a.mat[0][0]; ans--; ans-=res; cout << ans<<endl; } return 0; }


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 性xxxxⅹhd成人| 精品亚洲综合久久中文字幕 | 欧美性xxxxxbbbbbb精品 | 伊人精品成人久久综合欧美 | 成人区视频 | 视频日韩p影院永久免费 | 日本护士handjob | 色琪琪一本到影院 | 91亚洲精品国产第一区 | 亚洲精品456人成在线 | 国产成人午夜性a一级毛片 国产成人系列 | 免费中文字幕视频 | 欧美在线免费 | 国产日本欧美在线观看乱码 | 亚洲a影院 | 亚洲欧美日韩不卡 | 一区二区福利视频 | 中文字幕乱码中文字幕 | 欧美xx毛片免费看 | 免费观看18视频网站 | 亚洲图片一区二区 | 一级久久久 | 亚洲国产网址 | 精品在线免费观看 | 亚洲区视频在线观看 | 羞羞网站在线看 | 午夜免费啪视频观看网站 | 99精品小视频 | 综合婷婷丁香 | 欧美肥老太 | 免费播放春色aⅴ视频 | 国产永久免费爽视频在线 | 高清在线观看视频 | 日韩视频一区 | 91精品亚洲| 亚洲成在人线av | 精品一区二区91 | 亚洲福利精品一区二区三区 | 一级做a爰片久久毛片图片 一级做a爰片欧美aaaa | 欧美激情性xxxxx | 亚洲免费视频观看 |