又是ac自動機上用矩乘優化dp= =
其實和上一題基本一樣。。。補集轉化思想。。
只是要多弄乙個小矩陣求(26^1+26^2+....+26^l),並且也要求f的總和(因為是長度<=l)
直接調上一題的偽板子了= =
喜聞樂見ce了好幾發。。。就因為iostream裡有next這個名字的函式》_
1 #include2 #include3view code#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 }
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 ...