题意:给定n个不能出现的模式串,给定一个长度m,要求长度为m的合法串有多少种。
思路:用AC自动机,利用AC自动机上的节点做矩阵乘法。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #define MOD 100000 9 char s[2005]; 10 int ch(char x){ 11 if (x=='A') return 0; 12 if (x=='C') return 1; 13 if (x=='G') return 2; 14 if (x=='T') return 3; 15 return -1; 16 } 17 struct Trie{ 18 int fail[1005],next[1005][5],end[1005],L,root; 19 int newnode(){ 20 for (int i=0;i<4;i++) 21 next[L][i]=-1; 22 end[L++]=-1; 23 return L-1; 24 } 25 void clear(){ 26 L=0; 27 root=newnode(); 28 } 29 void insert(char s[]){ 30 int len=strlen(s),now=root; 31 for (int i=0;i