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

时间限制:15000ms

单点时限:3000ms

内存限制:512MB

描述

小Hi平时的一大兴趣爱好就是演奏钢琴。我们知道一段音乐旋律可以被表示为一段数构成的数列。

神奇的是小Hi发现了一部名字叫《十进制进行曲大全》的作品集,顾名思义,这部作品集里有许多作品,但是所有的作品有一个共同特征:只用了十个音符,所有的音符都表示成0-9的数字。

现在小Hi想知道这部作品中所有不同的旋律的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0)。答案有可能很大,我们需要对(10^9 + 7)取摸。

解题方法提示

输入

第一行,一个整数N,表示有N部作品。

接下来N行,每行包含一个由数字0-9构成的字符串S。

所有字符串长度和不超过 1000000。

输出

共一行,一个整数,表示答案 mod (10^9 + 7)。

样例输入

2
101
09

样例输出

131

题解在题目里已经有了,这里大致说一下吧

假设这题只有一个串,那么建出自动机后有

ans(u) = ∑(10ans(v)+|substr(v)|*str[vu]),其中ans[v]表示v节点所有子串代表的数字之和,|substr(v)|表示v节点子串个数,str[v→u]表示节点v到节点u的那个数字字符,答案就是∑ans(i)

多个串的解决方法:

对于所有的串,用'#'隔开并接在一起成为一个字符串,建出后缀自动机后有

ans(u) = ∑(10ans(v)+(|substr(v)|-|subfor#(v)|)*str[vu]),其中ans[v]表示v节点所有不含#的子串代表的数字之和,|substr(v)|表示v节点子串个数,|subfor#(v)|表示v节点包含'#'的子串个数,str[v→u]表示节点v到节点u的那个字符,若str[vu] = '#',不进行转移,答案仍是∑ans(i)

以上都已可以通过拓扑序BFS时线性统计

#include<stdio.h>
#include<vector>
#include<queue>
#include<string.h>
#include<algorithm>
using namespace std;
#define LL long long
#define mod 1000000007
typedef struct Node
{int len, pre;int Next[12];
}Node;
Node tre[2000005];
int cnt, last, in[2000005], sum[2000005];
LL ans[2000005];
char str[1000005];
void Init()
{cnt = last = 0;memset(tre, 0, sizeof(tre));tre[cnt++].pre = -1;
}
void Insert(int ch)
{int p, q, now, rev;p = last, now = cnt++;tre[now].len = tre[last].len+1;while(p!=-1 && tre[p].Next[ch]==0){tre[p].Next[ch] = now;p = tre[p].pre;}if(p==-1)tre[now].pre = 0;else{q = tre[p].Next[ch];if(tre[q].len==tre[p].len+1)tre[now].pre = q;else{rev = cnt++;tre[rev] = tre[q];tre[rev].len = tre[p].len+1;tre[q].pre = tre[now].pre = rev;while(p!=-1 && tre[p].Next[ch]==q){tre[p].Next[ch] = rev;p = tre[p].pre;}}}last = now;
}
int main(void)
{LL all;int n, i, j, now, v, len;scanf("%d", &n);Init();while(n--){scanf("%s", str+1);for(i=1;str[i]!=0;i++)Insert(str[i]-'0');if(n!=0)Insert(10);}for(i=0;i<=cnt-1;i++){for(j=0;j<=10;j++)in[tre[i].Next[j]]++;}queue<int> q;q.push(0);while(q.empty()==0){now = q.front();q.pop();len = 1;if(now)len = tre[now].len-tre[tre[now].pre].len;for(i=0;i<=10;i++){v = tre[now].Next[i];if(v!=0){if(i!=10){ans[v] = (ans[v]+ans[now]*10+(LL)(len-sum[now]+mod)*i)%mod;sum[v] += sum[now];}elsesum[v] += len;in[v]--;if(in[v]==0)q.push(v);}}}all = 0;for(i=0;i<=cnt-1;i++)all = (all+ans[i])%mod;printf("%lld\n", all);return 0;
}
/*
2
12
234
*/

hihocoder 1457 : 后缀自动机四·重复旋律7(后缀自动机+拓扑序BFS)相关推荐

  1. HihoCoder - 1457 后缀自动机四·重复旋律7(后缀自动机)

    题目链接:点击查看 题目大意:给出 n 个由 0~9 的数字组成的字符串,现在要求每个子串所表示的十进制下数字的累加之和 题目分析:因为对于字符串的所有子串而言数量无疑是非常庞大的,所以我们选择用后缀 ...

  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. Git bash 终止git log 命令
  2. MySQL数据库az排序_RDS Mysql Single-AZ和Multi-AZ性能差异
  3. 从无到有算法养成篇:一文读懂有关Tree的前世今生
  4. matlab 高维数组赋值,MATLAB之三(高)维数组的创建
  5. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170410
  6. 如何正确执行碎片整理或在群集共享卷(CSV)上使用CHKDSK命令
  7. 你的第一个Django程序
  8. Oracle 查询练习及答案
  9. java mongodb 多文档_如何通过Java在MongoDB中一次性插入多个文档
  10. 那些慢慢消失的手机功能,最怀念第一个!
  11. 7-13爬虫入门之BeautifulSoup对网页爬取内容的解析
  12. 如何实现用户认证授权系统
  13. 【转】Numpy三维数组的转置与交换轴
  14. php提取ip源码,PHP(源码) 如何获取客户端的IP地址
  15. 一个远程线程注入的类
  16. Mesos+Marathon docker 集群管理
  17. c oracle 参数赋值,利用c#反射实现实体类生成以及数据获取与赋值
  18. 综治应急指挥中心建设方案
  19. c语言在线翻译器,command(c语言翻译工具)
  20. 【笔记】Android APP 上架 Google Play 采坑记之「应用签名证书」

热门文章

  1. python经典实例-Python机器学习经典实例
  2. python3入门代码-Python3零基础自学方法?
  3. python必备入门代码-python基础入门这一篇就够
  4. 一种语音识别模型的训练方法及装置与流程
  5. Function的常用属性和方法
  6. Vue的调试工具(Chrome 浏览器)配置
  7. FFmpeg源代码简单分析:avcodec_encode_video()
  8. 耐克人脸识别_狄耐克智能交通再结一位“老铁”——与力高地产达成战略合作协议!...
  9. mask属性是css3的吗_CSS滤镜之Mask属性
  10. eclipse project修改 output folder