[bzoj1009][HNOI2008]GT考试(dp+矩阵加速+KMP)

来源:互联网 发布:华族经典 知乎 编辑:程序博客网 时间:2024/06/14 00:54

传送门
dp
f(i,j)ij
f(i,j)=kjf(i1,k)
AA(i,j)ij
f(i,j)=kf(i1,k)A(k,j)
线

KMP
fail
KMP便
AC
代码:

/**************************************************************    Problem: 1009    User: stone41123    Language: C++    Result: Accepted    Time:80 ms    Memory:1300 kb****************************************************************/#include<cstdio>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<cstdlib>#define ll long longusing namespace std;inline int read(){    int x=0;char ch=' ';int f=1;    while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();    if(ch=='-')f=-1,ch=getchar();    while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();    return x*f;}int p;struct matrix{    int n,m;    ll a[30][30];    matrix(){        memset(a,0,sizeof(a));    }    inline matrix operator * (const matrix& y) const {        matrix c;        c.n=n;        c.m=y.m;        for(int i=0;i<c.n;i++){            for(int j=0;j<c.m;j++){                for(int k=0;k<m;k++){                    c.a[i][j]=(c.a[i][j]+a[i][k]*y.a[k][j])%p;                }            }        }        return c;    }}f;int n,m;char ch[30];int P[30];int fail[30];void getfail(){    fail[0]=fail[1]=0;    for(int i=1;i<m;i++){        int j=fail[i];        while(j&&P[i]!=P[j])j=fail[j];        if(P[i]==P[j])j++;        fail[i+1]=j;    }    f.n=m;    f.m=m;    for(int i=0;i<m;i++){        for(int j=0;j<=9;j++){            int k=i;            while(k&&P[k]!=j)k=fail[k];            if(P[k]==j)k++;            if(k!=m)f.a[i][k]++;        }    }}matrix ksm(matrix A,ll b){    matrix ans=A;    b--;    while(b){        if(b&1){            ans=ans*A;        }        A=A*A;        b>>=1;    }    return ans;}int main(){    scanf("%d %d %d",&n,&m,&p);    scanf("%s",ch);    for(int i=0;i<m;i++){        P[i]=ch[i]-'0';    }    getfail();    f=ksm(f,n);    matrix A;    A.n=1;    A.m=m;    A.a[0][0]=1;    A=A*f;    ll ans=0;    for(int i=0;i<m;i++){        ans=(ans+A.a[0][i])%p;    }    printf("%lld",ans);    return 0;}
阅读全文
0 0
原创粉丝点击