题目链接:点击查看

题目大意:给出 n 个由 0~9 的数字组成的字符串,现在要求每个子串所表示的十进制下数字的累加之和

题目分析:因为对于字符串的所有子串而言数量无疑是非常庞大的,所以我们选择用后缀自动机+动态规划来解决,这次我们用不到后缀链接了,而是根据parent tree的性质,一直转移答案,因为假如某个节点 cur 的下一个节点 to 是当前节点加上了数字 num 后形成的,那么转移方程就是 val[ to ] += val[ cur ] * 10 + cnt[ cur ] * num,不过需要注意的是,虽然是单纯的在parent tree上转移,但还是要按照拓扑序来才行,以上说的是对于一个字符串而言的,如果有多个字符串,我们可以用类似于后缀数组的形式将其用特殊的符号拼接起来,这里我们选择用冒号 ' : ' 拼接,因为冒号的ASCII码恰好是 ' 0 ' + 10 ,方便处理,在进行转移的时候,我们不选择跨过冒号的点就好了

代码:

#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
using namespace std;typedef long long LL;typedef unsigned long long ull;const int inf=0x3f3f3f3f;const int N=1e6+100;const int mod=1e9+7;char s[N];int tot=1,last=1,id[N<<1],tong[N<<1],cnt[N<<1];LL val[N<<1];struct Node
{int ch[26];int fa,len;
}st[N<<1];void add(int x)
{int p=last,np=last=++tot;st[np].len=st[p].len+1;while(p&&!st[p].ch[x])st[p].ch[x]=np,p=st[p].fa;if(!p)st[np].fa=1;else{int q=st[p].ch[x];if(st[p].len+1==st[q].len)st[np].fa=q;else{int nq=++tot;st[nq]=st[q]; st[nq].len=st[p].len+1;st[q].fa=st[np].fa=nq;while(p&&st[p].ch[x]==q)st[p].ch[x]=nq,p=st[p].fa;//向上把所有q都替换成nq}}
}void radix_sort()
{for(int i=1;i<=tot;i++)tong[st[i].len]++;for(int i=1;i<=tot;i++)tong[i]+=tong[i-1];for(int i=1;i<=tot;i++)id[tong[st[i].len]--]=i;
}int main()
{
//#ifndef ONLINE_JUDGE
//  freopen("input.txt","r",stdin);
//#endif
//  ios::sync_with_stdio(false);int n;scanf("%d",&n);while(n--){scanf("%s",s);int len=strlen(s);for(int i=0;i<len;i++)add(s[i]-'0');if(n)add(10);}radix_sort();cnt[1]=1;for(int i=1;i<=tot;i++){int cur=id[i];for(int j=0;j<10;j++){int to=st[cur].ch[j];if(to){cnt[to]+=cnt[cur];val[to]=(val[to]+(val[cur]*10+1LL*cnt[cur]*j)%mod)%mod;}}}LL ans=0;for(int i=1;i<=tot;i++)ans=(ans+val[i])%mod;printf("%lld\n",ans);return 0;
}

HihoCoder - 1457 后缀自动机四·重复旋律7(后缀自动机)相关推荐

  1. hihocoder 1457 : 后缀自动机四·重复旋律7(后缀自动机+拓扑序BFS)

    #1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成 ...

  2. hihoCoder #1457 : 后缀自动机四·重复旋律7

    题目链接 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里 ...

  3. HihoCoder - 1465 后缀自动机五·重复旋律8(后缀自动机)

    题目链接:点击查看 题目大意:给出一个模式串,在给出多个匹配串,问每个匹配串与其"循环相似旋律"的字符串,在模式串中出现的总次数,"循环相似旋律"指的是一个字符 ...

  4. HihoCoder - 1445 后缀自动机二·重复旋律5(后缀自动机)

    题目链接:点击查看 题目大意:给出一个字符串 s ,求 s 中本质不同的子串的数量 题目分析:因为 s 的长度给到了 1e6 ,用后缀数组可能会超时,所以最好的方法肯定是用后缀自动机来做,因为每个节点 ...

  5. #1419 : 后缀数组四·重复旋律4 (重复次数最多的连续字串)

    题目链接 思路 如何求一个串中的最大重复次数? 枚举循环节的大小,判断它是否合法. 如何快速判断循环节合法? LCP(LCP(LCP(原串, 原串−-−循环节)))是否完全匹配. 如何快速求串AAA和 ...

  6. hihocoder 1465 : 后缀自动机五·重复旋律8(后缀自动机+最长公共子串)

    1465 : 后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的 ...

  7. hihocoder 1449 : 后缀自动机三·重复旋律6(后缀自动机)

    #1449 : 后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  8. hiho一下第128周 后缀自动机二·重复旋律5

    #1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...

  9. hiho一下120周 后缀数组一·重复旋律

    后缀数组一·重复旋律 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列. 小Hi ...

最新文章

  1. 2021年UI设计培训机构哪个好
  2. 为什么windows系统能运行项目linux和Mac不行
  3. 用了那么多年的 Master 分支或因种族歧视而成为历史?
  4. linux脚本求命令行上整数和,shell脚本--cut命令与awk简单使用
  5. excel表格怎么调整行高和列宽_8个实用Excel小技巧,谁用谁说好
  6. 如何解开机器学习的面纱?
  7. string类的常用函数
  8. ARM的位置无关程序设计
  9. 分布式数据库中间件对比总结
  10. 浪潮通信收入_浪潮获2019大数据“星河(Galaxy)”奖
  11. Expert 诊断优化系列------------------你的CPU高么?
  12. ADSL宽带路由密码恢复经验详谈
  13. c# SIM 卡拨号
  14. STM32编程软件分享——MDK5安装包以及调试工具
  15. 3Ds Max动画课程设计
  16. 《2022年 Android 中高级面试题汇总》及答案整理(备战金九银十)
  17. TortoiseSVN安装及导入已有SVN仓库
  18. 【报告分享】2021年小红书kol营销白皮-千瓜数据(附下载)
  19. linux虚拟光驱挂载教程,Linux操作系统下虚拟光驱(iso)的挂载
  20. Linux安装配置ssh 基于unbantu22.04.1 LTS版本

热门文章

  1. 缓冲区Buffer-Buffer操作基本API
  2. collection 和association 的区别?
  3. 数据库事务原理详解-Spring 事务的传播属性
  4. 再述Spring AOP 应用场景
  5. 将session维护在客户端
  6. HDFS的API操作-访问权限问题
  7. SpringMVC拦截器之介绍和搭建环境
  8. Apollo客户端读取数据原理
  9. 初始化方法-创建对象时自动调用初始化方法
  10. 结合webpack配置_前端 Webpack 工程化的最佳实践