[NC13C]形态形成场/[Gym100430B]Divisible Substrings
[NC13C]形态形成场/[Gym100430B]Divisible Substrings
题目大意:
有\(m(m\le26)\)个字符串替换式\(S_i(|S_i\le100|)\),表示某个大写字母对应的字符串。比如\(A\rightarrow BB,B\rightarrow CC0,C\rightarrow 123\),代表 \(A=12312301231230,B=1231230,C=123\)。最后一个对应串只包含数字,其余只包含数字和在它之后的大写字母。字母由'A'
开始依次出现,问'A'
所代表的字符串有多少子串满足:
- 这个子串为单个字符
'0'
或没有前导'0'
。 - 把这个子串看作一个十进制数后模\(n(n\le30)\)等于\(0\)。
答案对\(r(r\le10^9)\)取模。
思路:
对于每一段字符串维护其必要信息,每次暴力合并维护信息。具体见代码注释。
源代码:
#include<cstdio>
#include<cctype>
#include<cstring>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int K=26,S=101,N=30,D=10;
int n,mod,m;
char s[K][S];
struct Node {
int num,cnt,len,pre[N][N],suf[N];
//num: 值%n
//cnt: 满足条件的子串数
//len: 10^{长度}%n
//pre[i][j]: 前缀num=i、len=j个数
//suf[i]: 后缀num=i个数
};
Node t[D],f[K];
inline void merge(Node &a,const Node &b) {
(a.cnt+=b.cnt)%=mod;
for(register int i=0;i<n;i++) {
for(register int j=0;j<n;j++) {
const int k=(n-(int64)i*j%n)%n;
(a.cnt+=(int64)b.pre[k][j]*a.suf[i]%mod)%=mod;
}
}
for(register int i=0;i<n;i++) {
for(register int j=0;j<n;j++) {
(a.pre[((int64)a.num*j+i)%n][j*a.len%n]+=b.pre[i][j])%=mod;
}
}
int tmp[n];
memcpy(tmp,b.suf,sizeof tmp);
for(register int i=0;i<n;i++) {
(tmp[((int64)i*b.len+b.num)%n]+=a.suf[i])%=mod;
}
memcpy(a.suf,tmp,sizeof tmp);
a.num=((int64)a.num*b.len+b.num)%n;
a.len=(int64)a.len*b.len%n;
}
int main() {
freopen("divisible.in","r",stdin);
freopen("divisible.out","w",stdout);
n=getint(),mod=getint(),m=getint();
for(register int i=0;i<m;i++) {
while(getchar()!='>');
scanf("%s",s[i]);
}
for(register int i=0;i<D;i++) {
t[i].num=i%n;
t[i].cnt=i%n==0;
t[i].len=10%n;
t[i].pre[i%n][10%n]=1;
t[i].suf[i%n]=i!=0;//0本身不可以作为后缀进行合并
}
for(register int i=m-1;i>=0;i--) {
f[i].len=1;
for(register int j=0;s[i][j];j++) {
merge(f[i],isdigit(s[i][j])?t[s[i][j]-'0']:f[s[i][j]-'A']);
}
}
printf("%d\n",f[0].cnt);
return 0;
}
[NC13C]形态形成场/[Gym100430B]Divisible Substrings的更多相关文章
- 形态形成场(矩阵乘法优化dp)
形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...
- 牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)
传送门: 淳平的形态形成场 题解: 把a排序后,直接统计答案恰好为a[i]并不好做,可以统计答案>a[i]的方案数,设为\(f[i]\). 即不存在一个联通块,所有的权值都<=a[i]. ...
- HJA的异或值
HJA的异或值 查看 提交 统计 提问 总时间限制: 20000ms 内存限制: 512000kB 描述 形态形成场(Morphogenetic Field)假说是Rupert Sheldrake ...
- 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if the number of different ch ...
- Kattis之旅——Divisible Subsequences
Given a sequence of positive integers, count all contiguous subsequences (sometimes called substring ...
- [CF百场计划]Codeforces Round #617 (Div. 3)
A. Array with Odd Sum Description You are given an array \(a\) consisting of \(n\) integers. In one ...
- Dynamics CRM 之ADFS 使用 WID 的联合服务器场
使用 WID 的联合服务器场 默认拓扑 Active Directory 联合身份验证服务 (AD FS) 是联合服务器场,使用 Windows 内部数据库 (WID). 在这种拓扑, AD FS 使 ...
- CATransition自定义转场动画
我们可以通过CATransiton来自定义一些漂亮的转场动画, CATransition继承自CAAnimation, 所以用法跟CAAnimation差不多 先直接上一个代码: #import &q ...
- Dynamics CRM 之ADFS 使用 SQL Server 的联合服务器场
此拓扑用于 Active Directory 联合身份验证服务 (AD FS) 不同于使用 Windows 内部数据库 (WID) 部署拓扑,因为不会将数据复制到每台联合服务器场中的联合身份验证服务器 ...
随机推荐
- 【leetcode 简单】第十六题 二进制求和
给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1" 输出: ...
- Problem D. Berland Railroads Gym - 101967D (思维)
题目链接:https://cn.vjudge.net/contest/274029#problem/D 题目大意:给你0-9每个数的个数,然后让你找出最大的数,满足的条件是任意三位相连的都能被三整除. ...
- ajax技术整理总结(1)
1.创建ajax对象 var xhr=new XMLHttpRequest(); 4.监听状态信息 xhr.onreadystatechange=function(){ //4接收完毕 ){ docu ...
- SQL server(到主机的TCPIPl连接失败的问题)
1 首先要做的是在sql新建查询里输入 exec sys.sp_readerrorlog 0, 1, 'listening' 运行后 会显示你的sql 正在运行的tcp/ip接口 看看是否和你java ...
- tar解压与压缩
1.解压 tar -zxvf 压缩文件名 -C 指定的目录 (制定的目录必须存在) 2.压缩 tar -czvf 压缩后的文件名 要压缩的文件夹
- 42、和为S的两个数字
一.题目 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 二.解法 import java.util.ArrayLis ...
- 安全测试===CSRF攻击简介
http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html
- SSL证书生成方法【转】
转自 SSL证书生成方法 - fyang的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/fyang2007/article/details/6180361 一般情况 ...
- 定位、判断、cookie的脚本案例
Action(){ lr_think_time(20); lr_start_transaction("µã»÷ÊÂÏî°ìÀíÇé¿ö°´Å¥"); web_url("L ...
- 发布PHP项目(nginx+PHP7+mysql 5.6)
一.环境检查 1.检查nginx ps -ef | grep "nginx" 显示如下内容则代表nginx启动正常 root 3285 1 0 12:57 ? 00:00:00 n ...