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+打表找规律的更多相关文章

  1. 【ZOJ】3785 What day is that day? ——浅谈KMP在ACM竞赛中的暴力打表找规律中的应用

    转载请声明出处:http://www.cnblogs.com/kevince/p/3887827.html    ——By Kevince 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这 ...

  2. 【ZOJ】3785 What day is that day? ——KMP 暴力打表找规律

    转自:http://www.cnblogs.com/kevince/p/3887827.html 首先声明一下,这里的规律指的是循环,即找到最小循环周期. 这么一说大家心里肯定有数了吧,“不就是nex ...

  3. HDU 4731 Minimum palindrome 打表找规律

    http://acm.hdu.edu.cn/showproblem.php?pid=4731 就做了两道...也就这题还能发博客了...虽然也是水题 先暴力DFS打表找规律...发现4个一组循环节.. ...

  4. hdu 3032 Nim or not Nim? (SG函数博弈+打表找规律)

    Nim or not Nim? Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Sub ...

  5. HDU 5753 Permutation Bo (推导 or 打表找规律)

    Permutation Bo 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5753 Description There are two sequen ...

  6. HDU 4861 Couple doubi (数论 or 打表找规律)

    Couple doubi 题目链接: http://acm.hust.edu.cn/vjudge/contest/121334#problem/D Description DouBiXp has a ...

  7. 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 ...

  8. HDU 5795 A Simple Nim(SG打表找规律)

    SG打表找规律 HDU 5795 题目连接 #include<iostream> #include<cstdio> #include<cmath> #include ...

  9. hdu_5894_hannnnah_j’s Biological Test(打表找规律)

    题目链接:hdu_5894_hannnnah_j’s Biological Test 题意: 有n个不同的位置围成一个圈,现在要安排m个人坐,每个人至少的间隔为k,问有多少种安排 题解: 先打表找规律 ...

随机推荐

  1. HashMap与ConcurrentHashMap的区别(转)

    从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心. 在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从 ...

  2. html-select

    <html><head> <title>select选择标签</title> <meta charset="UTF-8"> ...

  3. 【转】在SharePoint Server 2010中更改“我的网站”

    在安装SharePoint Server 2010的时候,创建的第一个站点是一个"NetBIOS名称"的网站,而这个时候,"我的网站"(或称"个人网站 ...

  4. vim 添加插件

    vim 的功能可以通过向它添加plugin得以扩展.所谓的plugin不过是一个vim会自动载入执行的脚本.把一个脚本放到你的plugin目录就可以了,非常容易. plugin基本上分为两类:  全局 ...

  5. 485. Max Consecutive Ones最长的连续1的个数

    [抄题]: Given a binary array, find the maximum number of consecutive 1s in this array. Example 1: Inpu ...

  6. SQL 数据库 学习 002 如何启动 SQL Server 软件

    如何启动 SQL Server 软件 我的电脑系统: Windows 10 64位 使用的SQL Server软件: SQL Server 2014 Express 如果你还没有下载 SQL Serv ...

  7. ROS naviagtion analysis: costmap_2d--Layer

    博客转载自:https://blog.csdn.net/u013158492/article/details/50493113 这个类中有一个LayeredCostmap* layered_costm ...

  8. Hyperledger Fabric1.0 整体结构

    整体结构 Hyperledger Fabric 在 1.0 中,架构已经解耦为三部分: fabric-peer:主要起到 peer 作用,包括 endorser.committer 两种角色: fab ...

  9. Entity Framework在不同数据库下的配置

    http://blog.csdn.net/weiky626/article/details/17068593 http://blog.csdn.net/niewq/article/details/41 ...

  10. Reportng 的测试报告在 Jenkins 中显示不全

    通过Jenkins执行接口测试生成测试报告,用Jenkins的web服务打开html显示不全. 环境: Jenkins版本:1.651.2 Jenkins发布在mac上面 使用的是testng管理测试 ...