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

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

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 2000010;
 4 const int mod = 1e9 + 7;
 5 char s[maxn];
 6 int len[maxn<<1], tr[maxn<<1][11], link[maxn<<1];
 7 int sz, last;
 8 void init(){
 9     sz = last = 0;
10     len[0] = 0, link[0] = -1;
11     memset(tr, -1, sizeof tr);
12     ++sz;
13 }
14 void sa(int c){
15     c = c - ‘0‘;
16     int cur = sz++;
17     len[cur] = len[last] + 1;
18     int p;
19     for(p = last; ~p && tr[p][c] == -1; p = link[p]){
20         tr[p][c] = cur;
21     }
22     if(p == -1) link[cur] = 0;
23     else{
24         int q = tr[p][c];
25         if(len[p] + 1 == len[q]) link[cur] = q;
26         else{
27             int co = sz++;
28             len[co] = len[p] + 1;
29             for(int i = 0; i < 10; i++) tr[co][i] = tr[q][i];
30             link[co] = link[q];
31             for(; ~p && tr[p][c] == q; p = link[p]) tr[p][c] = co;
32             link[q] = link[cur] = co;
33         }
34     }
35     last = cur;
36 }
37 long long ans;
38 int ind[maxn<<1], vis[maxn<<1];
39 int cnt[maxn<<1], sum[maxn<<1];
40 void cal(){
41     queue<int> q;
42     memset(vis, 0, sizeof vis);
43     memset(ind, 0, sizeof ind);
44     q.push(0);
45     vis[0] = 1;
46     while(!q.empty()){
47         int u = q.front(); q.pop();
48         for(int i = 0; i < 10; i++){
49             if(tr[u][i] != -1) ind[tr[u][i]]++;
50             if(!vis[tr[u][i]]){
51                 vis[tr[u][i]] = 1;
52                 q.push(tr[u][i]);
53             }
54         }
55     }
56     cnt[0] = 1, sum[0] = 0;
57     q.push(0);
58     while(!q.empty()){
59         int u = q.front(); q.pop();
60         for(int i = 0; i < 10; i++) {
61             int v = tr[u][i];
62             if(v != -1){
63                 cnt[v] += cnt[u];
64                 sum[v] = (sum[v] + sum[u] * 10LL % mod + i * cnt[u]) % mod;
65                 ind[v]--;
66                 if(!ind[v]) q.push(v);
67             }
68         }
69     }
70     for(int i = 0; i < sz; i++) ans = (ans + sum[i]) % mod;
71 }
72 int main(){
73     int n;
74     while(scanf("%d", &n) != EOF){
75         init();
76         int pos = 0;
77         for(int i = 0; i < n; i++){
78             scanf("%s", s + pos);
79             pos += strlen(s + pos);
80             s[pos] = ‘:‘;
81             pos++;
82         }
83         s[--pos] = ‘\0‘;
84         for(int i = 0; i < pos; i++) sa(s[i]);
85         ans = 0;
86         cal();
87         printf("%lld\n", ans);
88     }
89 }

原文地址:https://www.cnblogs.com/yijiull/p/8508189.html

时间: 2024-11-05 16:04:27

后缀自动机四·重复旋律7的相关文章

hihocoder #1457 : 后缀自动机四&#183;重复旋律7

#1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品,但是所有的作品有一个共同特征:只用了十个音符,所有的音符都表示成0-9的数字. 现在小Hi想知道这部作品中所有不同的旋律的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0).答案有可能

BZOJ 后缀自动机四&#183;重复旋律7

后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品,但是所有的作品有一个共同特征:只用了十个音符,所有的音符都表示成0-9的数字. 现在小Hi想知道这部作品中所有不同的旋律的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0).答案有可能很大,我们需要对

hihocoder 1457 后缀自动机四&#183;重复旋律7 求不同子串的和

描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品,但是所有的作品有一个共同特征:只用了十个音符,所有的音符都表示成0-9的数字. 现在小Hi想知道这部作品中所有不同的旋律的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0).答案有可能很大,我们需要对(10^9 + 7)取摸. 解题方法提示 × 解题方法提示 小Hi:我们已经学习了后缀自动机,今天

【后缀自动机】【拓扑排序】【动态规划】hihocoder1457 后缀自动机四&#183;重复旋律7

解题方法提示 小Hi:我们已经学习了后缀自动机,今天我们再来看这道有意思的题. 小Ho:好!这道题目让我们求的是若干的数字串所有不同子串的和. 小Hi:你能不能结合后缀自动机的性质来思考如何解决本题? 小Ho:这道题目既然是关于子串,那么我知道从后缀自动机的所有状态中包含的子串的集合恰好对应原串的所有不重复子串. 小Hi:很好.那你可以先简化问题,想想只有一个串怎么做? 小Ho:好的.这个难不倒我.我上次已经知道如何计算一个串所有不同子串的数量,现在这题也类似,只不过计算更加复杂一点. 小Hi:

hiho一下第128周 后缀自动机二&#183;重复旋律5

#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中出现了多少不同的旋律? 解题方法提示 输入 共一行,包含一个由小写字母构成的字符串.字符串长度不超过 1000000. 输出 一行一个整数,表示答案. 样例输入 aab 样例输出 5 解题方法提示 小Hi:本周的题目其实就是给定一个字符串S,要求出S的所有不同子串的数

后缀数组四&#183;重复旋律4

后缀数组四·重复旋律4 时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为长度为 N 的数构成的数列.小Hi在练习过很多曲子以后发现很多作品中的旋律有重复的部分. 我们把一段旋律称为(k,l)-重复的,如果它满足由一个长度为l的字符串重复了k次组成. 如旋律abaabaabaaba是(4,3)重复的,因为它由aba重复4次组成. 小Hi想知道一部作品中k最大的(k,l)-重复旋律. 解题方法提示 输入 一

hihocoder #1449 : 后缀自动机三&#183;重复旋律6

#1449 : 后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数.但是K不是固定的,小Hi想知道对于所有的K的答案. 解题方法提示 × 解题方法提示 小Hi:上次我们已经学习了后缀自动机了,今天我们再来解决一个用到后缀自动机的问题. 小Ho:好!那我们开始吧! 小Hi:现在我们要对K

hihocoder #1465 : 后缀自动机五&#183;重复旋律8

#1465 : 后缀自动机五·重复旋律8 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 小Hi发现旋律可以循环,每次把一段旋律里面最前面一个音换到最后面就成为了原旋律的“循环相似旋律”,还可以对“循环相似旋律”进行相同的变换能继续得到原串的“循环相似旋律”. 小Hi对此产生了浓厚的兴趣,他有若干段旋律,和一部音乐作品.对于每一段旋律,他想知道有多少在音乐作品中的子串(重复便多

hiho一下第129周 后缀自动机二&#183;重复旋律6

后缀自动机三·重复旋律6 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数列. 现在小Hi想知道一部作品中所有长度为K的旋律中出现次数最多的旋律的出现次数.但是K不是固定的,小Hi想知道对于所有的K的答案. 解题方法提示 输入 共一行,包含一个由小写字母构成的字符串S.字符串长度不超过 1000000. 输出 共Length(S)行,每行一个整数,表示答案. 样例输入 aab 样例输出