[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的更多相关文章

  1. 形态形成场(矩阵乘法优化dp)

    形态形成场(矩阵乘法优化dp) 短信中将会涉及前\(k\)种大写字母,每个大写字母都有一个对应的替换式\(Si\),替换式中只会出现大写字母和数字,比如\(A→BB,B→CC0,C→123\),代表 ...

  2. 牛客挑战赛33 F 淳平的形态形成场(无向图计数,EGF,多项式求逆)

    传送门: 淳平的形态形成场 题解: 把a排序后,直接统计答案恰好为a[i]并不好做,可以统计答案>a[i]的方案数,设为\(f[i]\). 即不存在一个联通块,所有的权值都<=a[i]. ...

  3. HJA的异或值

    HJA的异或值 查看 提交 统计 提问 总时间限制:  20000ms 内存限制:  512000kB 描述 形态形成场(Morphogenetic Field)假说是Rupert Sheldrake ...

  4. 微软2016校园招聘在线笔试第二场 题目1 : Lucky Substrings

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if the number of different ch ...

  5. Kattis之旅——Divisible Subsequences

    Given a sequence of positive integers, count all contiguous subsequences (sometimes called substring ...

  6. [CF百场计划]Codeforces Round #617 (Div. 3)

    A. Array with Odd Sum Description You are given an array \(a\) consisting of \(n\) integers. In one ...

  7. Dynamics CRM 之ADFS 使用 WID 的联合服务器场

    使用 WID 的联合服务器场 默认拓扑 Active Directory 联合身份验证服务 (AD FS) 是联合服务器场,使用 Windows 内部数据库 (WID). 在这种拓扑, AD FS 使 ...

  8. CATransition自定义转场动画

    我们可以通过CATransiton来自定义一些漂亮的转场动画, CATransition继承自CAAnimation, 所以用法跟CAAnimation差不多 先直接上一个代码: #import &q ...

  9. Dynamics CRM 之ADFS 使用 SQL Server 的联合服务器场

    此拓扑用于 Active Directory 联合身份验证服务 (AD FS) 不同于使用 Windows 内部数据库 (WID) 部署拓扑,因为不会将数据复制到每台联合服务器场中的联合身份验证服务器 ...

随机推荐

  1. 解决爬虫时网站采用gb2312编码所遇到的乱码问题!

    import requests from bs4 import BeautifulSoupall_url = 'http://www.7160.com/qingchunmeinv/' # 请求头 he ...

  2. 【zTree】zTree展开树节点

    今天在做zTree树的时候想着将第一级tree展开,于是利用下面方法: /** * 展开树节点的第一层 */ function openFirstTreenode(){ // 获取树对象 var tr ...

  3. 36 - 网络编程-TCP编程

    目录 1 概述 2 TCP/IP协议基础 3 TCP编程 3.1 通信流程 3.2 构建服务端 3.3 构建客户端 3.4 常用方法 3.4.1 makefile方法 3.5 socket交互 3.4 ...

  4. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  5. 全面了解 Nginx 主要应用场景

    前言 本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得.所以还请见谅,同时欢迎留言交流 N ...

  6. Entity Framework 5.0 Code First全面学习 (转)

    原文地址:感谢原文作者 http://blog.csdn.net/gentle_wolf/article/details/14004345 不贴图片了,太累. Code First 约定 借助 Cod ...

  7. 从LabVIEW到C++

    前言 最近一段时间一直没有更新,一方面是时间精力的问题(PS:懒癌犯了),另一方面是小黑大部分的时间都在学习C++相关知识,恶补了许多的知识(从大学C语言水平强制拔高了一段). 本文谈谈自己近期的一些 ...

  8. fastJson去掉指定字段

    public static String filterFieldsJson(Object src, Class<?> clazz, String... args) { SimpleProp ...

  9. [ python ] 字符串的操作及作业题

    字符串的操作方法 capitalize() : 首字母大写 s1 = 'my heart will go on' print(s1.capitalize()) # 首字母大写 # 执行结果: # My ...

  10. fail2ban安全设置

    1.先安装fail2ban服务包(这里我采用的是fail2ban-0.8.14.tar.gz) 2.解压安装包 cd /data/software tar xzf fail2ban-0.8.14.ta ...