题目大意:
题解:
利用AC自动机的dp求出所有的转移
然后将所有的转移储存到矩阵中,进行矩阵乘法即可#include#include #include using namespace std;typedef long long ll;inline void read(int &x){ x=0;char ch;bool flag = false; while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true; while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;}const int maxn = 88;int maxc,n,m;int ch[maxn][26],nodecnt;bool danger[maxn];inline void insert(char *s){ int len = strlen(s),nw = 0; for(int i=0;i n = n;this->m = m; memset(s,0,sizeof s); } Matrix friend operator * (const Matrix &a,const Matrix &b){ Matrix c;c.clear(a.n,b.m); for(int i=0;i >=1,x=x*x) if(p&1) ret=ret*x; return ret;}char s[22];int main(){ read(n);read(m);read(maxc); for(int i=1;i<=n;++i){ scanf("%s",s); insert(s); }build(); ori.clear(1,nodecnt+2);ori.s[0][nodecnt+1] = 1.0; mul.clear(nodecnt+2,nodecnt+2); for(int i=0;i<=nodecnt;++i){ for(int c=0;c