题目传送门

题意:

  给出若干个串,求所有子串的和,子串和的定义为十进制数,取模1e9+7.

思路:

  对于一个串来说,一个状态p就代表着$right$相同的集合,假设我们已经知道了状态p的$sum$,以及状态p的$size$,假设p的下一位有一个c,p+c的状态为q,那么$sum[q]+=sum[p]*10+c*size[p]$,并且要更新$size[q]$,注意这里是“+=”,因为q也有可能通过其他方式得到。

  而这道题的终点就是如何转移,显然是用拓扑,但困扰了我好久的就是如何处理一开始每个点的入度。

  这是我一开始的代码。

  

    for(int i=;i<=tot;i++){
for(int j=;j<;j++){
in[ch[i][j]]++;
}
}

  这个代码的意思就是我把每个点和后面能抵达的点全部建边了,但这样答案会少,原因是有些点的入度永远不会0,所以少计算了,这个入度处理方式是错误的。

  为什么呢?因为我们在处理多个串的时候,需要用一个':'符号来连接两个字符串,而这个符号刚好比‘9’大1,而我们下面用拓扑进行dp的时候,由于我们根本不会在队列里放入":"这个字符,所以形如$:5$这样的入度永远不会被减去,就无法入队。

  所以我们处理入度的方式还是要用拓扑。

#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+;
const int maxn=;
char s[maxn];
int len[maxn<<],ch[maxn<<][],fa[maxn<<],tot=,root=,last=,siz,r[maxn<<];
int a[maxn<<],c[maxn<<],ans[maxn<<];
ll dp[maxn<<];
void extend(int x){
int now=++tot,pre=last;
last=now,len[now]=len[pre]+;
while( pre && !ch[pre][x]){
ch[pre][x]=now;
pre=fa[pre];
}
if(!pre)fa[now]=root;
else{
int q = ch[pre][x];
if(len[q]==len[pre]+)fa[now]=q;
else {
int nows=++tot;
memcpy(ch[nows],ch[q],sizeof(ch[q]));
len[nows]=len[pre]+;
fa[nows]=fa[q];
fa[q]=fa[now]=nows;
while(pre&&ch[pre][x]==q){
ch[pre][x]=nows;
pre=fa[pre];
}
}
}
}
bool vis[maxn<<];
int in[maxn<<];
int main(){
int n;
cin>>n;
while(n--){
scanf("%s",s);
siz=strlen(s);
for(int i=;i<siz;i++)
{
int p=s[i]-'';
extend(p);
}
extend();
}
queue<int >q;
q.push(); vis[] = ;
while(!q.empty()){
int x = q.front(); q.pop();
for(int c = ; c < ; c++){
int y = ch[x][c];
if(y == ) continue;
if(!vis[y])
q.push(y); vis[y] = ;
in[y]++;
}
}
q.push();
r[]=;
while(!q.empty()){
int i=q.front();
q.pop();
for(int j=;j<;j++){
int p=ch[i][j];
if(p){
r[p]=(r[p]+r[i])%mod;
dp[p]=(dp[p]+dp[i]*%mod+j*r[i]%mod)%mod;
if(--in[p]==){
q.push(p);
}
}
}
} ll res=;
for(int i=;i<=tot;i++){
res=(res+dp[i])%mod;
}
cout<<res<<endl; }

  

hiho#1457 重复旋律7 求子串和 后缀自动机的更多相关文章

  1. hiho#1445 重复旋律5 求子串数量 后缀自动机

    题目传送门 题意:给出一个字符串,求子串的个数. 思路:后缀自动机的题真是每做一题就更理解一些. SAM中的每一状态$p$都代表了一种子串,而p包含的字符串的个数是$len[p]-len[fa[p]] ...

  2. hiho# 1465 重复旋律8 循环串计数 后缀自动机

    题目传送门 题意:给出一个母串,再给出n个串,问对于每个串,母串中有几个子串是可以通过循环变化得到这个串. 思路:对母串建SAM,求出$right$集. 把匹配串复制一遍,和母串进行匹配,当匹配长度大 ...

  3. hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机

    题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...

  4. 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)

    [BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...

  5. hihocoder 1457 后缀自动机四·重复旋律7 求不同子串的和

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

  6. hihocoder 后缀自动机五·重复旋律8 求循环同构串出现的次数

    描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以 ...

  7. SPOJ1811最长公共子串问题(后缀自动机)

    题目:http://www.spoj.com/problems/LCS/ 题意:给两个串A和B,求这两个串的最长公共子串. 分析:其实本题用后缀数组的DC3已经能很好的解决,这里我们来说说利用后缀自动 ...

  8. CODE【VS】3160 最长公共子串 (后缀自动机)

    3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ...

  9. bzoj千题计划318:bzoj1396: 识别子串(后缀自动机 + 线段树)

    https://www.lydsy.com/JudgeOnline/problem.php?id=1396 后缀自动机的parent树上,如果不是叶子节点,那么至少有两个子节点 而一个状态所代表子串的 ...

随机推荐

  1. Java 设计模式系列(二)简单工厂模式和工厂方法模式

    Java 设计模式系列(二)简单工厂模式和工厂方法模式 实现了创建者和调用者的分离.分为:简单工厂模式.工厂方法模式.抽象工厂模式 简单工厂模式.工厂方法模式都很简单,就不详细介绍了. 一.简单工厂 ...

  2. 企业招聘:UX设计师需要满足他们哪些期望?

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具.   为了确定2017年最有价值的用户体验技能和特质,我特地参考了150多份工作要求.最后,得出了以下 ...

  3. 如何在Github上删除项目及某个文件

    在Github上删除项目 在GitHub仓库中找到已经建立好的某个仓库,本篇文章以我的myBookCodes仓库为例,在建立的myBookCodes仓库中首先找到settings选项,如图所示: 将页 ...

  4. Oracle学习笔记(一)

    用户与表空间 系统用户: 一.系统用户级别sys.system 最高级(sys级别高于system)sysman 操作企业管理器使用的scott 创始人之一的名字scott默认密码是tiger登录方法 ...

  5. Firefox mobile (android) and orientationchange

    Firefox for Android does not support the orientationchange event but you can achieve the same result ...

  6. WIN7 PHP环境 WAMP一键安装

    PHP环境自己搭建比较麻烦,需要配置APACHE,PHP,MYSQL,更改一堆.ini文件配置 所以使用一键安装包比较好,省时省力省心. WAMP 是 WIN+APACHE+MYSQL+PHP 一键安 ...

  7. Python学习之全局变量与global

    刚学习Python,遇到个问题:为什么有些定义在函数外的变量可以直接被函数使用,有些就不行呢? 如: count = 0 def change(): count += 1 change() # 报错 ...

  8. poj 2981 Strange Way to Express Integers (中国剩余定理不互质)

    http://poj.org/problem?id=2891 Strange Way to Express Integers Time Limit: 1000MS   Memory Limit: 13 ...

  9. LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)

    http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS     M ...

  10. MessagingTimeout: Timed out waiting for a reply to message ID

    l3中出现大量消息超时错误,对网络的操作各种异常. 报错如下: 2016-02-25 05:54:59.886 15110 ERROR neutron.agent.l3.agent [req-db92 ...