【ARC077F】SS kmp+打表找规律
Description
如果某个串可以由两个一样的串前后连接得到,我们就称之为“偶串”。比如说“xyzxyz”和“aaaaaa”是偶串,而“ababab”和“xyzxy”则不是偶串。
对于一个非空串SS,我们定义f(S)f(S)是在SS后面添加一些字符得到的最短偶串。比如f(f('abaaba')=)='abaababaab'。容易证明,对于一个非空串SS,f(S)f(S)是唯一的
现在给定一个由小写英文字母构成的偶串SS,你需要求出f10100(S)f10100(S),并统计计算结果的第ll个字符到第rr个字符中,每个字母出现了多少次
其中,f10100(S)f10100(S)是指f(f(f(...f(S)...)))f(f(f(...f(S)...))),式子中共有1010010100个ff
Input
第一行输入串SS
第二行两个数l,rl,r
Output
对于每个字母,输出一个数字表示答案,两个数字之间应有一个空格
Sample Input
Sample #1
abaaba
6 10
Sample #2
xx
1 1000000000000000000
Sample #3
vgxgpuamkvgxgvgxgpuamkvgxg
1 1000000000000000000
Sample Output
Sample #1
3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Sample #2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000000000000000000 0 0
Sample #3
87167725689669676 0 0 0 0 0 282080685775825810 0 0 0 87167725689669676 0 87167725689669676 0 0 87167725689669676 0 0 0 0 87167725689669676 141040342887912905 0 141040342887912905 0 0
HINT
2≤|S|≤2×10^5
1≤l≤r≤10^18
本题采用subtask。
- 存在30%的数据,满足|S|≤20
- 存在50%的数据,满足|S|≤200
Sol
对于一个串,我们设为“SS”,它的最短周期为“T"(也就是S由T循环组成且最后一个T可以不完整),以”abaaba“举例,我们发现:
S->aba T->ab
aba|aba->abaab|abaab->abaababa|abaababa->abaababaabaab|abaababaabaab
即S|S->ST|ST->STS|STS->STSTS|STSTS。
这是一个斐波那契数列的形式,我们可以对每种字母单独求,因为fib数列到80就会爆1e18,所以时间复杂度不会爆炸,具体地,我们统计每种字母在S中出现次数的前缀和,然后递归计算,把l-1或者r分成很多fib数列的形式,若不满|S|,则直接返回。
Code
#include <bits/stdc++.h>
#define ll long long
using namespace std;
char s[200005];ll len,slen,tlen,sum[30][200005],nex[200005],l,r;
ll solve(ll now,int n)
{
if(now<=len) return sum[n][now];
ll f1=sum[n][slen],f2=sum[n][len],l1=slen,l2=len,tf,tl;
while(l1+l2<now) tf=f2,tl=l2,f2+=f1,l2+=l1,f1=tf,l1=tl;
return f2+solve(now-l2,n);
}
main()
{
scanf("%s%lld%lld",s+1,&l,&r);len=strlen(s+1)/2;
for(int i=2,j=0;i<=len;i++)
{
while(j&&s[i]!=s[j+1]) j=nex[j];
if(s[j+1]==s[i]) nex[i]=++j;
}
slen=len-nex[len];
for(int i=0;i<26;i++) for(int j=1;j<=len;j++)
{
sum[i][j]=sum[i][j-1];
if(s[j]-'a'==i) sum[i][j]++;
}
for(int i=0;i<26;i++) printf("%lld ",solve(r,i)-solve(l-1,i));
}
【ARC077F】SS kmp+打表找规律的更多相关文章
- 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用
转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...
- 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律
转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...
- HDU 4731 Minimum palindrome 打表找规律
http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...
- hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)
Nim or not Nim? Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Sub ...
- HDU 5753 Permutation Bo (推导 or 打表找规律)
Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...
- HDU 4861 Couple doubi (数论 or 打表找规律)
Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...
- HDU2149-Good Luck in CET-4 Everybody!(博弈,打表找规律)
Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- HDU 5795 A Simple Nim(SG打表找规律)
SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...
- hdu_5894_hannnnah_j’s Biological Test(打表找规律)
题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...
随机推荐
- ffmpeg码率控制
一.VBR与CBR的含义和区别 VBR是动态码率.CBR是静态码率. VBR(Variable Bitrate)动态比特率.也就是没有固定的比特率,压缩软件在压缩时根据音频数据即时确定使用什么比特率, ...
- oracle误删数据的解决方法
之前不小心误删了一条数据,索性我还记得id,通过select * from 表名 as of timestamp to_timestamp('2017-6-23 9:10:00','yyyy-mm-d ...
- POJ3624(背包问题)
1.题目链接地址 http://poj.org/problem?id=3624 2.源代码 #include<iostream> using namespace std; #define ...
- js格式化时间和时间操作
js格式化时间 function formatDateTime(inputTime) { var date = new Date(inputTime); var y = date.getFullYea ...
- Subscript & Inheritance
[Subscript] 1.subscript的定义: 2.Subscript的使用: 3.可以定义多维subscript: 多维Subscript的使用: [Inheritance] 1.overr ...
- GIT常用命令以及作用【备忘】
git commit 提交一个修改 git branch branchName 新建一个branchName的分支 git merge branchName 将当前分支与branchName分支合 ...
- mfs测试
续1 6. 参考文献: 6.1 文献 http://sery.blog.51cto.com/10037/263515 田逸 http://bbs.chinaunix.net/thread-16438 ...
- opennebula 安装指定参数
[root@opennebula opennebula-]# ./install.sh -u oneadmin -g oneadmin -k -d /home/oneadmin/ -u 指定用户-g ...
- 二项分布 , 多项分布, 以及与之对应的beta分布和狄利克雷分布
1. 二项分布与beta分布对应 2. 多项分布与狄利克雷分布对应 3. 二项分布是什么?n次bernuli试验服从 二项分布 二项分布是N次重复bernuli试验结果的分布. bernuli实验是什 ...
- Luogu 3899 [湖南集训]谈笑风生
BZOJ 3653权限题. 这题方法很多,但我会的不多…… 给定了$a$,我们考虑讨论$b$的位置: 1.$b$在$a$到根的链上,那么这样子$a$的子树中的每一个结点(除了$a$之外)都是可以成为$ ...