首页 > 其他分享 >CF585F Digits of Number Pi

CF585F Digits of Number Pi

时间:2023-10-15 14:24:51浏览次数:32  
标签:Digits int Number trie 500001 Pi 1001

CF585F Digits of Number Pi

更好的阅读体验

观察数据范围,考虑数位 DP。

首先把长串中 \(len\geq\lfloor \frac{d}{2}\rfloor\) 的串提出来,塞进一个 trie 里,然后建立 ACAM,然后直接 DP 就行了。

设 \(f_{i,j,0/1,0/1,0/1}\) 表示当前在 trie 图上走了 j 步到达了第 i 个节点,是否已经出现子串,是否满足低位限制,是否满足高位限制,枚举 \(k\) 表示第 \(j\) 个字符是什么,然后在 AC 自动机上跑。第三个 \(0/1\) 在走到一个结束点后就一定是 \(1\),第四个维度选了一个大于 \(x\) 串当前位的字符后变成 \(1\),第五个维度也是同理,细节比较多,但是实在是没有任何思维含量。详细的转移方程见代码。

inline void Madd(int&x,int y){x+y>=MOD?x=x+y-MOD:x=x+y;}
int n,d,ans,f[2][500001][2][2][2];
char s[1001],t1[1001],t2[1001];
namespace ACAM
{
	int end[500001],trie[500001][10],fail[500001],cnt=1;
	queue<int> q;
	inline void build()
	{
		for(int i=0;i<10;++i)trie[0][i]=1;
		for(int i=1;i+d/2-1<=n;++i)
		{
			int now=1;
			for(int j=i;j<=min(n,i+d/2-1);++j)
			{
				if(!trie[now][s[j]-'0'])trie[now][s[j]-'0']=++cnt;
				now=trie[now][s[j]-'0'];
				if(j>=i+d/2-1)end[now]=1;
			}
		}
		q.e(1);
		while(!q.empty())
		{
			int now=q.front();q.pop();
			for(int i=0;i<10;++i)
			{
				if(trie[now][i])fail[trie[now][i]]=trie[fail[now]][i],q.e(trie[now][i]);
				else trie[now][i]=trie[fail[now]][i];
			}
		}
	}
}
using namespace ACAM;
#define g f[pre][trie[i][k]]
#define nw f[now][i]
inline void mian()
{
	scanf("%s%s%s",s+1,t1+1,t2+1),ans=0,n=strlen(s+1),d=strlen(t1+1);
	for(int i=1;i<=d;++i)t1[i]-='0',t2[i]-='0';
	build(),f[1][1][0][0][0]=1;int now=0,pre=1;
	for(int j=0;j<d;++j)
	{
		now^=1,pre^=1,memset(f[pre],0,sizeof(f[pre]));
		for(int i=1;i<=cnt;++i)
		{
			for(int k=0;k<10;++k)
			{
				int is=end[trie[i][k]];
				if(k<t1[j+1])
				{
					if(k<t2[j+1])
					{
						Madd(g[is|0][1][1],nw[0][1][0]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][1][1],nw[1][1][0]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else if(k==t2[j+1])
					{
						Madd(g[is|0][1][0],nw[0][1][0]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][1][0],nw[1][1][0]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else
					{
						Madd(g[is|0][1][1],nw[0][1][1]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
				}
				else if(k==t1[j+1])
				{
					if(k<t2[j+1])
					{
						Madd(g[is|0][0][1],nw[0][0][0]),Madd(g[is|0][0][1],nw[0][0][1]);
						Madd(g[is|0][1][1],nw[0][1][0]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][0][1],nw[1][0][0]),Madd(g[is|1][0][1],nw[1][0][1]);
						Madd(g[is|1][1][1],nw[1][1][0]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else if(k==t2[j+1])
					{
						Madd(g[is|0][0][0],nw[0][0][0]),Madd(g[is|0][0][1],nw[0][0][1]);
						Madd(g[is|0][1][0],nw[0][1][0]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][0][0],nw[1][0][0]),Madd(g[is|1][0][1],nw[1][0][1]);
						Madd(g[is|1][1][0],nw[1][1][0]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else
					{
						Madd(g[is|0][0][1],nw[0][0][1]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][0][1],nw[1][0][1]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
				}
				else
				{
					if(k<t2[j+1])
					{
						Madd(g[is|0][1][1],nw[0][0][0]),Madd(g[is|0][1][1],nw[0][0][1]);
						Madd(g[is|0][1][1],nw[0][1][0]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][1][1],nw[1][0][0]),Madd(g[is|1][1][1],nw[1][0][1]);
						Madd(g[is|1][1][1],nw[1][1][0]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else if(k==t2[j+1])
					{
						Madd(g[is|0][1][0],nw[0][0][0]),Madd(g[is|0][1][0],nw[0][1][0]);
						Madd(g[is|0][1][1],nw[0][0][1]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][1][0],nw[1][0][0]),Madd(g[is|1][1][0],nw[1][1][0]);
						Madd(g[is|1][1][1],nw[1][0][1]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
					else
					{
						Madd(g[is|0][1][1],nw[0][0][1]),Madd(g[is|0][1][1],nw[0][1][1]);
						Madd(g[is|1][1][1],nw[1][0][1]),Madd(g[is|1][1][1],nw[1][1][1]);
					}
				}
			}
		}
	}
	for(int i=1;i<=cnt;++i)
	{
		Madd(ans,f[pre][i][1][0][0]),Madd(ans,f[pre][i][1][0][1]);
		Madd(ans,f[pre][i][1][1][0]),Madd(ans,f[pre][i][1][1][1]);
	}
	write(ans);
}

标签:Digits,int,Number,trie,500001,Pi,1001
From: https://www.cnblogs.com/WrongAnswer90-home/p/17765571.html

相关文章

  • 普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400
    目录普冉PY32系列(一)PY32F0系列32位CortexM0+MCU简介普冉PY32系列(二)UbuntuGCCToolchain和VSCode开发环境普冉PY32系列(三)PY32F002A资源实测-这个型号不简单普冉PY32系列(四)PY32F002A/003/030的时钟设置普冉PY32系列(五)使用JLinkRTT代替串口输出日志普冉P......
  • How can I change the reference numbers in manuscript to blue color?
    HowcanIchangethereferencenumbersinmanuscripttobluecolor?IamworkinginWord2010and EndNoteX7.Iwanttochangethecolorofcitationsinmanuscripttoblue(nottochangethemmanually), buttochangethemautomaticallyincreatingt......
  • webapi跨域访问
    1、在webconfig配置文件里面加入<system.webServer><customHeaders><addname="Access-Control-Allow-Origin"value="*"/><addname="Access-Control-Allow-Headers"value="authorization,Authoriz......
  • 普冉PY32系列(八) GPIO模拟和硬件SPI方式驱动无线收发芯片XN297LBW
    目录普冉PY32系列(一)PY32F0系列32位CortexM0+MCU简介普冉PY32系列(二)UbuntuGCCToolchain和VSCode开发环境普冉PY32系列(三)PY32F002A资源实测-这个型号不简单普冉PY32系列(四)PY32F002A/003/030的时钟设置普冉PY32系列(五)使用JLinkRTT代替串口输出日志普冉P......
  • 02 K8S API资源对象介绍01(Pod)
    一、认识YAML1.1什么是YAML官网:https://yaml.org/YAML是一种用来写配置文件的语言。JSON是YAML的子集,YAML支持整数、浮点数、布尔、字符串、数组和对象等数据类型。任何合法的JSON文档也是YANL文档,YAML语法规则:使用缩进表示层级关系,缩进不允许使用tab,只能使用空格,同一层级......
  • strapi系列-常用操作记录(创建中间件,创建关系型数据库,数据去掉attributes那一层)
    创建全局中间件创建关系型的数据https://docs.strapi.io/dev-docs/api/rest/relations{"product_types":{"connect":[10]},"product_tags":{"connect":[7,3,4]},"name":"TEST","......
  • Vue3| Pinia 持久化插件
    对vuex或Pinia里面的内容做本地持久化1.安装插件:npmipinia-plugin-persistedstate2.将插件添加到pinia实例上①main.js里导入持久化插件:importpiniaPluginPersistedstatefrom'pinia-plugin-persistedstate'② app.use(pinia.use(piniaPluginPersistedstate))......
  • Vue3| Pinia 的 action 异步写法
    import{defineStore}from'pinia'import{ref}from'vue'importaxiosfrom'axios'exportconstuseChannelStore=defineStore('channel',()=>{  constchannelList=ref([])  constgetList=()=>......
  • Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
    在设置Linux服务器各节点间免密时,出现如下问题:原因:SSH服务器的配置文件/etc/ssh/sshd_config,密码验证服务未打开。1、编辑 /etc/ssh/sshd_config文件在目标服务器node2节点中,编辑/etc/ssh/sshd_config文件:sudovi/etc/ssh/sshd_config修改配置文件......
  • Vue3| Pinia 的语法
    Pinia是Vue的最新状态管理工具,是Vuex的替代品Pinia的优势:1.提供更简单的API(去掉了mutation)2.提供符合组合式风格的API(和Vue3新语法统一)3.去掉了modules的概念,每一个store都是一个独立的模块4.配合TypeScript更加友好,提供可靠的类型推断 Pinia基本......