@description@

规定一个字符串为 “偶串” 当且仅当它可以表示成两个相同的字符串连接(如 "xyzxyz" 或 "aaaaaa")。

给定一个仅由小写字母组成的初始偶串 \(S_0\)。我们可以通过在 \(S_i\) 后加最少的字符(至少一个字符)得到新的偶串 \(S_{i+1}\),不难发现 \(S_{i+1}\) 是唯一存在的。

求在 \(S_{10^{100}}\) 中第 l 个字符到第 r 个字符中每个小写字母的出现次数。

传送门。

@solution@

考虑一个偶串 \(TT\) 怎么加最少的字符成为新的偶串 \(T'T'\):找到 \(T\) 的最大 border \(P\) 与最小周期 \(Q\),将 \(T\) 写作 \(Q + P\),则 \(T' = Q + P + Q\)。

我们考虑已知 \(T\) 怎么快速求 \(T'\) 的最大 border:

如果 \(T\) 是循环串,则 \(T'\) 也是循环串,因此 \(T'\) 的最大 border 长度 = \(|T'| - |Q|\)。

否则,\(T'\) 的最大 border 长度为 \(|Q|\)。

关于第二条结论,首先注意到 \(T'\) 的最大 border 长度 \(\leq |P| + |Q|\) 且 \(\geq |Q|\)。

画一画发现假如 \(T'\) 的最大 border 长度为 L,则 \(T\) 中长度为 L 的前缀存在长度为 \(|Q|\) 的 border,根据弱周期引理可推出矛盾。

关于实现,前一种太简单了不讲;后一种可以发现 \(T_i\) 是 \(T_{i-1}\) 与 \(T_{i-2}\) 的拼接,长度呈斐波那契数列增长(跟指数级差不多),因此递归求解即可。

然后发现前一种情况可以直接用后一种情况的写法,减少代码量。

@accepted code@

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll; const int MAXN = 200000; ll a[26], b[26], c[150][26], d[150]; char S[MAXN + 5]; int f[MAXN + 5];
int main() {
int n, m; ll l, r;
scanf("%s%lld%lld", S + 1, &l, &r);
n = strlen(S + 1), m = n / 2; f[0] = -1, f[1] = 0;
for(int i=2;i<=m;i++) {
int j = f[i - 1];
while( j != -1 && S[i] != S[j + 1] )
j = f[j];
f[i] = j + 1;
} int p = m - f[m];
for(int i=1;i<=p;i++) c[0][S[i] - 'a']++;
for(int i=1;i<=m;i++) c[1][S[i] - 'a']++;
int k; d[0] = p, d[1] = m;
for(k=1;d[k]<=r;k++) {
for(int j=0;j<26;j++)
c[k + 1][j] = c[k][j] + c[k - 1][j];
d[k + 1] = d[k] + d[k - 1];
} ll t = r;
for(int i=k;i>=0;i--) {
if( t >= d[i] ) {
for(int j=0;j<26;j++)
a[j] += c[i][j];
t -= d[i];
}
}
for(int i=1;i<=t;i++)
a[S[i] - 'a']++; t = l - 1;
for(int i=k;i>=0;i--) {
if( t >= d[i] ) {
for(int j=0;j<26;j++)
a[j] -= c[i][j];
t -= d[i];
}
}
for(int i=1;i<=t;i++)
a[S[i] - 'a']--; for(int i=0;i<26;i++) printf("%lld ", a[i]);
}

@details@

当然关于实现,递推也可以,而且写起来也比较简单。

@atcoder - ARC077F@ SS的更多相关文章

  1. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  2. 【arc077f】AtCoder Regular Contest 077 F - SS

    题意 给你一个形如"SS"的串S,以及一个函数\(f(x)\),\(x\)是一个形如"SS"的字符串,\(f(x)\)也是一个形如"SS"的 ...

  3. AtCoder Beginner Contest 066 B - ss

    题目链接:http://abc066.contest.atcoder.jp/tasks/abc066_b Time limit : 2sec / Memory limit : 256MB Score ...

  4. 【ARC077F】SS

    Description 如果某个串可以由两个一样的串前后连接得到,我们就称之为"偶串".比如说"xyzxyz"和"aaaaaa"是偶串,而& ...

  5. 【ARC077F】SS kmp+打表找规律

    Description ​ 如果某个串可以由两个一样的串前后连接得到,我们就称之为"偶串".比如说"xyzxyz"和"aaaaaa"是偶串, ...

  6. 【arc077f】AtCoder Regular Contest 074 F - Lotus Leaves

    题意 给定一个n*m的池塘,每个格子上可能有叶子. 从一个叶子出发,可以跳到相同行或相同列的叶子. 问至少去掉多少叶子,使得起点不能到达终点. \(n,m<=100\) 解法 很显然的最小割模型 ...

  7. AtCoder Grand Contest 008

    AtCoder Grand Contest 008 A - Simple Calculator 翻译 有一个计算器,上面有一个显示按钮和两个其他的按钮.初始时,计算器上显示的数字是\(x\),现在想把 ...

  8. 【atcoder F - Namori】**

    F- Namori http://agc004.contest.atcoder.jp/tasks/agc004_f Time limit : 2sec / Memory limit : 256MB S ...

  9. AtCoder Regular Contest 093

    AtCoder Regular Contest 093 C - Traveling Plan 题意: 给定n个点,求出删去i号点时,按顺序从起点到一号点走到n号点最后回到起点所走的路程是多少. \(n ...

随机推荐

  1. 关于mysql的metadata lock

    昨天晚上上线,却发现一个ddl语句长时间没有生效 查processlist, 发现包括ddl语句在内的众多查询提示 “Waiting for table metadata lock” 唯一没有该提示的 ...

  2. 51Nod - 1255

    也是第十一届校赛的C题,不过他把1e5改成了1e7. 一开始就想到用贪心做.思路是这样的:开一个字符数组ans保存答案.然后从头到尾遍历题目给出的字符串S,如果ans数组中还没有这个字母,那么就把字母 ...

  3. SpringBoot2.1电商通用(微信+支付宝)支付系统实战

    『课程目录』: ├─第10章 全模块电商系统之商品模块 │      10-1_商品列表-上.mp4 │      10-2_商品列表-中.mp4 │      10-3_商品列表-下.mp4 │  ...

  4. Spring Boot 开发集成 WebSocket,实现私有即时通信系统

    1/ 概述 利用Spring Boot作为基础框架,Spring Security作为安全框架,WebSocket作为通信框架,实现点对点聊天和群聊天. 2/ 所需依赖 Spring Boot 版本 ...

  5. DevOps知识点——3C知多少

    CI / CD是任何DevOps操作的两大基石,这是一种开发软件的方式,旨在生产快速而强大的软件,随时以可持续的方式发布更新. 当例行更改代码时,开发周期会更加频繁.更有意义且更快速.通过此过程,我们 ...

  6. [自动化-脚本]001.自动领淘金币:Anyweb模拟操作

    通过模拟手工操作的方法领取淘金币.该方法万能且通用,有能力的还可以自行修改脚本. 工具 软件下载 anywebscript.com 方法/步骤 1.安装软件如图所示 2.设置脚本: (1)进入网站:[ ...

  7. html5学习之路_007

    CSS概述 CSS指层叠样式表 CSS样式表极大地提高了工作效率 CSS基础语法 selector { property:value } 例:hi {color:red; font-size:14px ...

  8. [PHP学习教程 - 系统]001.引用文件(require & include)

    引用文件的方法有两种:require 及 include.两种方式提供不同的使用弹性. 1.require 的使用方法如 require("MyRequireFile.php"); ...

  9. 使用 fileupload 组件完成文件的上传应用

    1. 使用 fileupload 组件完成文件的上传应用 commons-dbutils-1.3.jarcommons-fileupload-1.2.1.jar 1). 需求: > 在 uplo ...

  10. ## H5 canvas画图白板踩坑

    最近接手了一个小型的H5,最主要的功能大概就是拍照上传和canvas画板了. 主要是记录一下自己菜到像傻子一样的技术. 1.canvas画板隔空打牛!画布越往上部分错位距离越小,越往下距离越大. 2. ...