zoukankan      html  css  js  c++  java
  • bzoj1009

    kmp和矩阵乘法的运用,还是挺明显的

    #include<cstdio>
    #include<cctype>
    using namespace std;
    inline void read(int &x){
    	char ch=getchar();x=0;
    	for(;!isdigit(ch);ch=getchar());
    	for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
    }
    char ch[22];
    int fl,n,m,mo,f[22],c[22][22],nex[22],a[22][22];
    inline int query(int x,int y){return x==y?9:8;}
    inline void init(){
    	f[0]=1;
    	for(int i=1;i<=m;i++)ch[i]-='0';
    	for(int t,i=2;i<=m;i++){
    		for(t=nex[i-1];ch[t+1]!=ch[i] && t;t=nex[t]);
    		if(ch[t+1]==ch[i])t++;
    		nex[i]=t;
    	}
    	for(int len,i=0;i<m;i++)for(int j=0;j<=9;j++){
    		if(j==ch[i+1])len=i+1;else{
    			for(len=nex[i];len && ch[len+1]!=j;len=nex[len]);
    			if(ch[len+1]==j)len++;
    		}
    		if(len==m)continue;
    		c[i][len]++;
    	}
    }
    inline void mul(){
    	for(int i=0;i<m;i++)a[0][i]=0;
    	for(int j=0;j<m;j++)
    		for(int k=0;k<m;k++)
    			(a[0][j]+=f[k]*c[k][j])%=mo;
    	for(int i=0;i<=m;i++)f[i]=a[0][i];
    }
    inline void sqrmul(){
    	for(int i=0;i<=m;i++)for(int j=0;j<=m;j++)a[i][j]=0;
    	for(int i=0;i<=m;i++)
    		for(int j=0;j<=m;j++)
    			for(int k=0;k<=m;k++)
    				(a[i][j]+=c[i][k]*c[k][j])%=mo;
    	for(int i=0;i<=m;i++)for(int j=0;j<=m;j++)c[i][j]=a[i][j];
    }
    int main(){
    	read(n),read(m),read(mo);scanf("%s",ch+1);
    	init();
    	for(;n;n>>=1,sqrmul())if(n&1)mul();
    	int ans=0;
    	for(int i=0;i<m;i++)ans=(ans+f[i])%mo;
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    P1281 书的复制 dp
    P3402 最长公共子序列(nlogn)
    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers
    P1202 黑色星期五
    P1205 方块转换
    [递推] hihocoder 1239 Fibonacci
    [二分] hihoCoder 1269 优化延迟
    [分治] POJ 3233 Matrix Power Series
    使用HTMLParser解析html
    CSAPP2e: Proxy lab 解答
  • 原文地址:https://www.cnblogs.com/MikuKnight/p/9782089.html
Copyright © 2011-2022 走看看