去网上找了一堆题解才看懂0.0 这里写的稍微详细一点吧
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct matrix{ int xx[22][22]; int* operator [] (int x) { return xx[x]; } }a,b; int n,m,p,ans; char s[100]; int next[100]; void operator *= (matrix &x,matrix &y) { int i,j,k; matrix z; memset(&z,0,sizeof z); for(i=0;i<m;i++) for(j=0;j<m;j++) for(k=0;k<m;k++) z[i][j]+=x[i][k]*y[k][j],z[i][j]%=p; x=z; } void KMP() { int i,fix=0; char j; for(i=2;i<=m;i++) { while( fix && s[fix+1]!=s[i] ) fix=next[fix]; if( s[fix+1]==s[i] ) ++fix; next[i]=fix; } for(i=0;i<m;i++) for(j='0';j<='9';j++) { fix=i; while( fix && s[fix+1]!=j ) fix=next[fix]; if( j==s[fix+1] ) b[i][fix+1]++; else b[i][0]++; } } void Quick_Power(int x) { while(x) { if(x&1)a*=b; b*=b; x>>=1; } } int main() { int i; cin>>n>>m>>p; scanf("%s",s+1); KMP(); for(i=0;i<m;i++) a[i][i]=1; Quick_Power(n); for(i=0;i<m;i++) ans+=a[0][i],ans%=p; cout<<ans<<endl; }
BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法
原文地址:http://blog.csdn.net/popoqqq/article/details/40188173