[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;
}

转载于:https://www.cnblogs.com/skylee03/p/9359290.html

[NC13C]形态形成场/[Gym100430B]Divisible Substrings相关推荐

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

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

  2. 生命的答案水知道(只有部分图片,要全的图片自己还是的网上下个pdf看吧)

    前言 从我开始拍摄水结晶,以全新的方法与水相识.相知至今,转眼便已8年. 在此之前,我一直用波动测定法进行与水相关的研究.当我知道水还有结晶这种独特的"容颜"之后,才发现,水实际上 ...

  3. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc

    2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...

  4. 19级算法训练赛第七场

    19级算法训练赛第七场 传送门:https://vjudge.net/contest/362412#problem/J A - 程序设计:合并数字 蒜头君得到了 n 个数,他想对这些数进行下面这样的操 ...

  5. 2020年校内ACM排位赛 NO.1场 题解反思

    J总设置的中午12点到傍晚17点的比赛时间,属实让一个每天要睡午觉的菜菜懵逼+难熬啊.途中差点睡着,小错误不断,题目难度也判断失误(预估高了题目难度QAQ,某些题目怎么着也得来点dp.快速幂或者卡数据 ...

  6. python 应声虫怎么做_职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫...

    职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫 职场人士如何处理好人际关系:要服从,但不要做毫无主见的应声虫 在一个公司里,领导是公司的核心,是公司政策的决策者,是公司的权威人物.对员工 ...

  7. LeetCode刷题记录6——696. Count Binary Substrings(easy)

    LeetCode刷题记录6--696. Count Binary Substrings(easy) 目录 LeetCode刷题记录6--696. Count Binary Substrings(eas ...

  8. hihocoder 1152 Lucky Substrings

    #1152 : Lucky Substrings 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 A string s is LUCKY if and only if t ...

  9. “北京今年入冬的第一场雪”,纪念博客园写日志一年了

    今天是2009年11月1日,北京下了入冬以来的第一场雪,就在昨天我还以为北京还是秋季,可是今天早上醒来看到外面飘落的大雪,已经意识到北京的冬天已经到来了 来博客园写博客一年了,结识了很多朋友,也为社区 ...

最新文章

  1. 在VIM里面设置自动补全功能
  2. win下php5.4安装ffmpeg-php扩展
  3. 自动化部署工具Fabric简介
  4. echarts全国城市经纬坐标json文件
  5. 样条曲线、样条函数、python绘画样条曲线
  6. java模板引擎哪个好_模板引擎比较
  7. Unity(四十五):光照烘焙
  8. SpringBoot的幕后推手是谁?
  9. 『处女作』3 年经验前端第一次跳槽面试总结
  10. 鼎捷APS助力茶花家居实现智能高效生产排程
  11. fd和FILE结构体
  12. 《SEO的艺术(原书第2版)》——2.6 垂直搜索引擎
  13. JZOJ ???? Or
  14. 大型企业AD架构规划(三)
  15. Windows操作系统优化
  16. MindFusion.Diagramming iOS 应用程序
  17. PureCodec 2021 完美解码 全能超高清解码播放器
  18. 新玺配资:股票集合竞价规则
  19. IOS开发之C基础-循环结构
  20. 演示:设置密码长度限制、密码加强

热门文章

  1. mongodb索引生成HTML页面,MongoDB高级索引
  2. mysql远程权限grant_mysql 赋给用户远程权限 grant all privileges on
  3. java 继承先后顺序_Java中的继承关系的加载顺序
  4. vue 定位所在地_vue系列教程之微商城项目|商品购买
  5. C 指针的有意思的描述
  6. python扫雷代码文件_基于Python实现的扫雷游戏实例代码
  7. 获取鼠标在盒子中的坐标
  8. Verilog中的条件编译语句 `ifdef、`else、`endif 等
  9. Cannot create a session after the response has been committed的处理
  10. 对spring 中IOC 的理解