将s所有长度为d/2的子串放进ac自动机中,直接匹配就可以判定半现串了
再对其做一个差分,询问一个前缀的半现串个数,在ac自动机上数位dp,f[i][j][0/1]表示走了i步(i位的字符串),走到节点j,是否达到上限的方案数
对于ac自动机上的结束节点,直接重置并累计答案即可

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 1005
4 #define c (s[i]-'0')
5 #define mod 1000000007
6 queue<int>q;
7 int V,n,d,ans,mi[51],mo[51],vis[N*50],nex[N*50],ch[N*50][11],f[51][N*50][2];
8 char s[N],s1[51],s2[51];
9 void add(int l,int r){
10 int k=0;
11 for(int i=l;i<=r;i++){
12 if (!ch[k][c])ch[k][c]=++V;
13 k=ch[k][c];
14 }
15 vis[k]=1;
16 }
17 void build(){
18 for(int i=0;i<10;i++)
19 if (ch[0][i])q.push(ch[0][i]);
20 while (!q.empty()){
21 int k=q.front();
22 q.pop();
23 for(int i=0;i<10;i++)
24 if (!ch[k][i])ch[k][i]=ch[nex[k]][i];
25 else{
26 nex[ch[k][i]]=ch[nex[k]][i];
27 q.push(ch[k][i]);
28 }
29 }
30 }
31 int query(char *s){
32 ans=0;
33 memset(f,0,sizeof(f));
34 mi[0]=mo[d]=f[0][0][1]=1;
35 for(int i=1;i<=d;i++)mi[i]=10LL*mi[i-1]%mod;
36 for(int i=d-1;i>=0;i--)mo[i]=(mo[i+1]+1LL*c*mi[d-i-1])%mod;
37 for(int i=0;i<d;i++)
38 for(int j=0;j<=V;j++){
39 if (vis[j])continue;
40 for(int k=0;k<10;k++){
41 int p=ch[j][k];
42 f[i+1][p][0]=(f[i+1][p][0]+f[i][j][0])%mod;
43 if (k<=c)f[i+1][p][k==c]=(f[i+1][p][k==c]+f[i][j][1])%mod;
44 }
45 }
46 for(int i=0;i<=d;i++)
47 for(int j=0;j<=V;j++)
48 if (vis[j])
49 ans=(ans+1LL*f[i][j][0]*mi[d-i]+1LL*f[i][j][1]*mo[i])%mod;
50 return ans;
51 }
52 int main(){
53 scanf("%s%s%s",s,s1,s2);
54 n=strlen(s);
55 d=strlen(s1);
56 V=0;
57 for(int i=0;i<=n-d/2;i++)add(i,i+d/2-1);
58 build();
59 ans=(query(s2)-query(s1)+mod)%mod;
60 for(int i=0,k=0;s1[i];i++){
61 k=ch[k][s1[i]-'0'];
62 if (vis[k]){
63 ans=(ans+1)%mod;
64 break;
65 }
66 }
67 printf("%d",ans);
68 }

[51nod1587]半现串的更多相关文章

  1. A股最新的自由现金流和折现估值查询

    A股最新的自由现金流折现估值,利用自由现金流折现的经典公式,采用 8%.9%.10%.11%.12%.15% 等贴现率来进行估值. SH600000:浦发银行的最新自由现金流和折现估值模型: 浦发银行 ...

  2. Banner 广告设计技巧及经验(转自UI中国)

    经常听到banner这个词,但是banner是什么意思呢?引用百度知道的解释:banner可以作为网站页面的横幅广告,也可以作为游行活动时用的旗帜,还可以是报纸杂志上的大标题.Banner主要体现中心 ...

  3. Codeforces Round #427 (Div. 2) Problem D Palindromic characteristics (Codeforces 835D) - 记忆化搜索

    Palindromic characteristics of string s with length |s| is a sequence of |s| integers, where k-th nu ...

  4. Kuangbin 带你飞 KMP扩展KMP Manacher

    首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...

  5. 【2019 1月集训 Day1】回文的后缀

    题意: 给定 n,s,求有多少个字符集大小为 s ,长度为 n 的字符串,使得其不存在一个长度大于 1 的回文后缀. 答案对 m 取模. 分析: 考场见到计数题的链式反应,想写暴力—>暴力难写— ...

  6. Codeforces Round #311 (Div. 2) E. Ann and Half-Palindrome 字典树/半回文串

    E. Ann and Half-Palindrome Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  7. 【poj1226-出现或反转后出现在每个串的最长公共子串】后缀数组

    题意:求n个串的最长公共子串,子串出现在一个串中可以是它的反转串出现.总长<=10^4. 题解: 对于每个串,把反转串也连进去.二分长度,分组,判断每个组. #include<cstdio ...

  8. KMP 解决串的模式匹配问题

    初学KMP的时候,一直不得要领.后来学习AC自动机的时候,一下子明白了KMP实际上是AC自动机的特殊情况. 首先贴三段代码,一组是回溯法,暴力求解,另外两个是KMP串模式匹配 /* 回溯法字符串匹配算 ...

  9. 利用反射快速给Model实体赋值 使用 Task 简化异步编程 Guid ToString 格式知多少?(GUID 格式) Parallel Programming-实现并行操作的流水线(生产者、消费者) c# 无损高质量压缩图片代码 8种主要排序算法的C#实现 (一) 8种主要排序算法的C#实现 (二)

    试想这样一个业务需求:有一张合同表,由于合同涉及内容比较多所以此表比较庞大,大概有120多个字段.现在合同每一次变更时都需要对合同原始信息进行归档一次,版本号依次递增.那么我们就要新建一张合同历史表, ...

随机推荐

  1. springcloud组件之hystrix服务熔断,降级,限流

    hystrix 简介 Hystrix是什么 在分布式环境中,许多服务依赖项中的一些必然会失败.Hystrix是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互.Hystrix通过 ...

  2. 创建线程的4种方法 and 线程的生命周期

    线程的启动和运行 方法一:使用start()方法:用来启动一个线程,当调用start方法后,JVM会开启一个新线程执行用户定义的线程代码逻辑. 方法二:使用run()方法:作为线程代码逻辑的入口方法. ...

  3. 安装早期老版本 Visual Studio

    安装早期老版本 Visual Studio https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

  4. Scrum Meeting 0429

    零.说明 日期:2021-4-29 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成部分后端管理 ...

  5. AIApe问答机器人Scrum Meeting 4.23

    Scrum Meeting 1 日期:2021年4月23日 会议主要内容概述:各成员汇报进度情况,前后端针对WebAPI进行协调与统一工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完 ...

  6. Go 里的超时控制

    前言 日常开发中我们大概率会遇到超时控制的场景,比如一个批量耗时任务.网络请求等:一个良好的超时控制可以有效的避免一些问题(比如 goroutine 泄露.资源不释放等). Timer 在 go 中实 ...

  7. 2021.9.22考试总结[NOIP模拟59]

    T1 柱状图 关于每个点可以作出两条斜率绝对值为\(1\)的直线. 将绝对值拆开,对在\(i\)左边的点\(j\),\(h_i-i=h_j-j\),右边则是把减号换成加号. 把每个点位置为横坐标,高度 ...

  8. 关于string转换为wstring问题

    方法一:需要调用windows的api函数进行转换,在vs2017上试验转换成功 #ifdef _MSC_VER #include <Windows.h> #endif // _MSC_V ...

  9. Allure快速入门

    1.关于Allure     Allure框架是一个灵活轻量级多语言测试报告工具,它不仅可以以WEB的方式展示简介的测试结果,而且允许参与开发过程的每个人从日常执行的测试中最大限度的提取有用信息.   ...

  10. x64 InlineHook 黑魔法

    目录 x64 InlineHook 黑魔法 为什么不能用X86 的HOOK方式? 原理:jmp + rip 进行寻址6字节方式跳转 手动InlineHook 临时地址x(找一块空内存) 计算偏移 源地 ...