給你 n 個病毒,問長度為 [1, m] 的,包括病毒的有多少。全都是小寫字母。
和 poj 2778 有點像。不一樣的是:
1) 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。
2) 求長度是 [1, m] 的。在矩陣裡面維度變成二倍。
[a 1]
[1 0] 左下面的 1 就是最後所求。a是矩陣的話,就把 1 變成 i 矩陣, 把 0 變成 零矩陣。
這裡建立好的轉移矩陣左下面的是 i 矩陣, 所以ans矩陣初始化的時候不是 i 矩陣,而是轉移矩陣。
如果把 ans 矩陣初始化為大 i 矩陣,那麼矩陣乘 (m+1) 次就好了。
[cpp]view plain
copy
print?
const
intnn = 33;
const
intkind = 26;
intcnt;
//狀態數,矩陣大小
char
ch[9];
intfail[nn];
//每個狀態的fail指標
intchild[nn][kind];
//01兩種
intend[nn];
//每個狀態是否已經包含一整個病毒
ll dp[nn][nn];//轉移矩陣
struct
tri;
intnewnode()
void
insert(
char
*str,
introot)
end[p] = 1;
} //這個建立fail指標不同於hdu2222
//這裡的fail不能有空指標,必須要指向乙個狀態
queue>q;
void
build_fail(
introot) else
} } }
void
init_dp()
for(
intj = 0; j < kind; ++j)
} dp[cnt+1][cnt+1] = 26;
++cnt;
} tri mul(tri x, tri y)
} }
return
z;
} ll solve(int
m)
} cnt = cnt * 2 + 1;
while
(m)
ll res = ans.a[cnt/2+1][cnt/2];
return
res;
} int
main()
build_fail(root);
init_dp();
ll res = solve(m);
cout<}
return
0;
}
HDU 2243 AC自動機 矩陣快速冪
中文題,不解釋 這道題其實和poj 2778是一樣的,只是需要對矩陣有著更深刻的理解而已。我們很容易便能像poj 2778一樣求出來不包含條件字串的字串方案。只是題目中要求長度小於等於l,所以我們可以在矩陣中手動加乙個點,這個點允許從任何狀態轉移而來。這點的意義表示字串終止。也就是說如果字串轉移到這...
MZ hdu 2243 AC自動機 矩陣加速
給你 n 個病毒,問長度為 1,m 的,包括病毒的有多少。全都是小寫字母。和 poj 2778 有點像。不一樣的是 1 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。2 求長度是 1,m 的。在矩陣裡面維度變成二倍。a 1 1 0 左下面的 1 就是最後所求。a是矩陣的話,就把 1...
HDOJ 2243 AC自動機 等比矩陣求和
題目是要說小於l長度的由小寫字母組成的字串有多少個包含所給的串.從正方向想.要求出包含的.並且還要踢去重複包含的.又要加上被多踢的.整個一容斥問題了.但這題明顯是不可行的.那麼換個角度.先求出總共小於l的單詞數 26 1 26 2 26 3 26 l 然後再減去不包括所給字串的單詞.相當於把每個單詞...