POJ2243 考研路茫茫 單詞情結

2022-03-30 13:43:19 字數 1907 閱讀 1774

又是ac自動機上用矩乘優化dp= =

其實和上一題基本一樣。。。補集轉化思想。。

只是要多弄乙個小矩陣求(26^1+26^2+....+26^l),並且也要求f的總和(因為是長度<=l)

直接調上一題的偽板子了= =

喜聞樂見ce了好幾發。。。就因為iostream裡有next這個名字的函式》_

1 #include2 #include3

#define ll long long

4#define ull unsigned long long

5using

namespace

std;

6int dl[33],fail[33],num[33];7

int ch[33][26],tot,next[33][26

];8 ull mp[36][36

];9 ull c[36][36],tmp[36][36

],ans;

10int

i,j,k,n,m,l,r,cnt;

11bool gg[103

];12

char s[23

];13

14 ll tm[103],t[103

];15

16 inline void trie(int

n)23 gg[p]=1;//

printf("gg: %d\n",p);24}

25 inline void

getfail()35}

36}37 inline void

getnext()

46else

50//

printf("%d %d next:%d\n",now,i,next[now][i]);51}

52}53}

54 inline void

upd()

6364

//for(i=1;i<=r;puts(""),i++)

65//

for(j=1;j<=r;j++)printf(" %lld",mp[i][j]);66}

6768

69 inline void

multoc()

76 inline void

multomp()

8384

intmain()

*/102

103while

(m)109

110//

for(i=1;i<=cnt;puts(""),i++)for(j=1;j<=cnt;j++)printf(" %llu",c[i][j]);

111//

for(i=1,ans=0;i<=cnt;i++)ans=(ans+c[i][1])%modd;

112 ull ans=c[cnt][cnt-1]*26

;113

for(i=1;i<=cnt-2;i++)ans-=c[i][1

];114 printf("

%i64u\n

",ans+1

);115

116 memset(mp,0,sizeof(mp)),memset(c,0,sizeof

(c)),

117 memset(ch,0,(tot+1)*4*26),memset(next,0,(tot+1)*4*26),memset(fail,0,(tot+1)<<2),memset(gg,0,tot+1),tot=0

;118

}119

//for(i=1,ans=0;i<=cnt;i++)ans=(ans+tm[i])%modd;

120//

printf("%lld\n",ans);

121return0;

122 }

view code

hdu 2243 考研路茫茫 單詞情結

hdoj 2243 不僅僅是考研路茫茫 a此題的過程也是路茫茫 終於到最後柳暗花明了 a這個題用了3天 或者說用了1個月 因為1個月前就學了kmp和ac自動機 雖然上個月那節課學了kmp匹配演算法 字典樹 ac自動機。當時就聽得一頭霧水 特別是kmp那個失敗指標 或者說成是next fail.有那麼...

Hduoj 2243 考研路茫茫 單詞情結

自動機 dp 快速冪取模 矩陣快速冪。這個題目和poj2778很相似,不過這個是求出包含的有多少個。也就是用總的個數減去不包含的。由於長度是1 l內的,所以我們得把所有的情況都給求出來。首先是求構成單詞的總的個數,也就是 26 1 26 2 26 3 26 l,當然我們可以將其寫成更一般的形式 26...

HDU 2243 考研路茫茫 單詞情結

這道題和poj2778類似都需要利用end陣列和next陣列的特性構建狀態陣列,不過這裡是需要經過至少乙個目標串,而且長度是不小於l的,即需要長度為1 l時的種數和。然後我們可以求出總數後減去不經過目標串的和,剩下的就是我們要的答案。設總數的陣列為f n 當n為1時答案為26,n為2時為26 26 ...