当前位置: 首页 > news >正文

BZOJ 1009 HNOI2008 GT考试 KMP算法+矩阵乘法

标题效果:给定的长度m数字字符串s。求不包括子s长度n数字串的数目
n<=10^9 看这个O(n)它与
我们不认为这 令f[i][j]长度i号码的最后的字符串j位和s前者j数字匹配方案
例如,当s至12312时间 f[i][3]它表示的长度i。123结尾且不包括子串”12312“的方案数
a[x][y]为f[i-1][x]转移至f[i][y]的方案数
换句话说(可能描写叙述不清楚) a[x][y]为s的长度为x的前缀加上一个数字后 后缀能够与最长长度为y的前缀匹配 这个数字能够有多少种
比方说12312 这个数字串生成的a数组为(数组从0開始):
9 1 0 0 0 0
8 1 1 0 0 0
8 1 0 1 0 0
9 0 0 0 1 0
8 1 0 0 0 1
a[2][1]=1 表示长度为2的前缀加上一个'1'之后最多与长度为1的前缀匹配
a[4][0]=8 表示长度为4的前缀加上'1''2'以外的数就变成了长度为0的前缀
可是a[x][5]表示全然匹配,不满足要求的题意,所以我们矩阵乘法时不考虑这一列
我们发现f[i-1]乘上这个矩阵就变成了f[i] 这个矩阵怎么求呢?KMP算法,对于每一个长度的前缀枚举下一个字符进行转移 详细写法详见代码
f初值是f[0][0]=1,f[0][x]=0 (x>0)
于是最后我们仅仅须要取答案矩阵的第一行就可以

去网上找了一堆题解才看懂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;
}


版权声明:本文博客原创文章,博客,未经同意,不得转载。

相关文章:

  • 用一条UPDATE语句交换两列的值
  • 信息异步处理,关于handle和thread交互信息,只能更改一个textview的问题原因分析
  • 控制输入文本框的宽度属性size
  • nginx,反向代理,负载均衡配置
  • HTML5分析实战WebSockets基本介绍
  • 一步一步跟着官方文档安装最新Zabbix(2.4.5)一
  • 数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game
  • yourtour的几种链接
  • 南阳58--最小步数(BFS)
  • 关于std::map
  • 枚举的简单应用(一)
  • 懒样样读《代码大全2》扯淡篇 第一弹
  • 每天一个linux命令【转】
  • LVS+keepalived+DRBD+heartbeat+mysql
  • 2015-8-10工作日志
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • js数组之filter
  • laravel5.5 视图共享数据
  • mongodb--安装和初步使用教程
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vultr 教程目录
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 机器学习学习笔记一
  • 目录与文件属性:编写ls
  • 入手阿里云新服务器的部署NODE
  • 使用parted解决大于2T的磁盘分区
  • 06-01 点餐小程序前台界面搭建
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (java)关于Thread的挂起和恢复
  • (分布式缓存)Redis持久化
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (算法)求1到1亿间的质数或素数
  • (一)认识微服务
  • (转)memcache、redis缓存
  • ./configure,make,make install的作用(转)
  • .NET 5种线程安全集合
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework 服务实现监控可观测性最佳实践
  • .Net mvc总结
  • .NET 简介:跨平台、开源、高性能的开发平台
  • .sdf和.msp文件读取
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Validated和@Valid校验参数区别
  • [ linux ] linux 命令英文全称及解释
  • []sim300 GPRS数据收发程序