題目是要說小於l長度的由小寫字母組成的字串有多少個包含所給的串...
從正方向想..要求出包含的..並且還要踢去重複包含的..又要加上被多踢的..整個一容斥問題了...但這題明顯是不可行的...那麼換個角度..先求出總共小於l的單詞數(26^1+26^2+26^3+...26^l)..然後再減去不包括所給字串的單詞...相當於把每個單詞看成poj2778中的病毒...
但還有個問題...如何求出矩陣a的 a+a^2+a^3+....a^l .. 這裡參考了 所構造的矩陣...
等比矩陣求和,有經典演算法,假定原矩陣為a,階數為n,那麼構造乙個階數為2n的矩陣,如下
| a e | 其中o代表o矩陣,e代表單位矩陣,這樣,求出的k次矩陣的右上n子矩陣正好是
| o e | 等比矩陣的k項和,這種構造法比我實現的兩次二分快了4倍左右。
這裡有個錯誤要注意...求出k次矩陣的右上子矩陣應該是k-1項的和...
program:
#include#include#include#include#define ull unsigned __int64
using namespace std;
struct node1
point[205];
struct node
temp,h,_2m[35],t;
char s[7];
queuemyqueue;
ull ans;
int n,l,m;
void built_trie()
memset(t.s,0,sizeof(t.s));
for (i=1;i<=2*m;i++) t.s[i][i]=1;
while (l)
t=matrix_mul(t,_2m[p],m);
l-=k;
} return;
}void _26p(int l)
void getdata()
int main()
return 0;
}
hdu 2243 AC自動機 矩陣加速
給你 n 個病毒,問長度為 1,m 的,包括病毒的有多少。全都是小寫字母。和 poj 2778 有點像。不一樣的是 1 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。2 求長度是 1,m 的。在矩陣裡面維度變成二倍。a 1 1 0 左下面的 1 就是最後所求。a是矩陣的話,就把 1...
MZ hdu 2243 AC自動機 矩陣加速
給你 n 個病毒,問長度為 1,m 的,包括病毒的有多少。全都是小寫字母。和 poj 2778 有點像。不一樣的是 1 這個是求包括的,我這麼做的,加一維用來表示已經包括了病毒的狀態。2 求長度是 1,m 的。在矩陣裡面維度變成二倍。a 1 1 0 左下面的 1 就是最後所求。a是矩陣的話,就把 1...
AC自動機 建立nlogn個AC自動機
string set queries 題意 給你3種操作,1 加入乙個串到集合中。2 刪除集合中的某乙個串 3 查詢集合中的字串在給定的字串種出現幾次。同乙個串可重複 解法 建立多個ac自動機,用二進位制分組來處理。加入給你21個串 分為 16 4 1,再新增乙個串的時候,即21 1,22 16 4...