[atARC077F]SS
(以下字符串下标从0开始,并定义$2s=s+s$)
考虑$f(S)$,即令$l=\max_{2i<|S|且S[0,i)=S[|S|-i,|S|)]}i$,则$f(S)=S+S[l,|S|-l)$
由于次数足够多,先做一次$S=f(S)$不影响答案,因此假设原串为$2S$(这个$S$不同于初始的$S$)
考虑$f(2S)$,类似的即令$l=\max_{i<|S|且S[0,i)=S[|S|-i,|S|)}i$(最长非自身的border),则$f(2S)=2(S+S[0,|S|-l))$
构造一个新的函数$g(S)=S+S[0,|S|-l)$,不难归纳得到$f_{k}(2S)=2g_{k}(S)$,且由于$|g_{10^{100}}(S)|\ge 10^{18}$,因此不需要考虑2倍,只需要求$g_{10^{100}}(S)$
令$T=S[0,|S|-l)$,那么$g_{2}(S)=g(S+T)$,记$S'=S+T$,即求$S'$时的$l$
根据$l$的定义可得$S[0,|S|-|T|)=S[|T|,|S|)$,代入到每一个字符即$\forall 0\le i<|S|-|T|,S_{i}=S_{i+|T|}$
若$|T|$为$|S|$的约数,由此不难得到$S=TT...T$,否则$S=TT...TP$(其中$P$为$T$的前缀),之后$l$所对应的$S$的border即为去掉第一个$T$后的串
对于第一种情况有$l=|S|$,可得$S'[0,l)=S[|S'|-l,|S'|)=S$,同时若有更大的$l'$,可得$TT...TP=PTT...T$(其中$P=T[0,l'-|S|)$),那么将两边同时去掉串首的$T$即得到$S$一个更长的border
(关于第二个为什么以$P$开头:首先由于其与$T$相同,必然是$T$的前缀,长度又等于$P$,根据前缀的唯一性即为$P$)
在此基础上继续归纳下去,即得$g_{k}(S)=g_{k-1}(S)+T=STT...T$(共$k$个$T$),简单计算一下即可
对于第二种情况有$l=|T|$,可得$S'[0,l)=S'[|S'|-l,|S'|)=T$,同时若存在更大的$l'$,则考虑两者相同的最后$|T|$个字符,前者是$T$的一个循环,后者即为$T$
假设以$T_{i}$开头,即得到$T_{j}=T_{(j+i)mod\ |T|}$,不难得到$T$必然是一个串循环若干次,这与KMP的性质矛盾,因此不存在更大的$l'$
接下来同样归纳,可得$g_{k+1}(S)=g_{k}(S)+g_{k-1}(S)$,考虑如何处理:
先将其差分,求长为$l$的前缀的各个字母数量,而由于$|g_{0}(S)|,|g_{1}(S)|\ge 1$,不难发现其在100项时长度一定超过$10^{18}$,找到最后一个$g_{k}(S)\le l$,之后统计$g_{k}(S)$的字母数量并递归$l-g_{k}(S)$即可
这样的时间复杂度最优可以达到$o(|S|+|\alpha|m)$(其中$m=100$)


1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define M 105
5 #define ll long long
6 int n,m,nex[N];
7 ll l,r,len[M],sum[M][31],ans[31];
8 char s[N];
9 void calc1(ll k,int p){
10 if (k<n)
11 for(int i=0;i<k;i++)ans[s[i]-'a']+=p;
12 else{
13 for(int i=0;i<n;i++)ans[s[i]-'a']+=p;
14 k-=n;
15 for(int i=0;i<nex[n];i++)ans[s[i]-'a']+=p*k/nex[n];
16 for(int i=0;i<k%nex[n];i++)ans[s[i]-'a']+=p;
17 }
18 }
19 void calc2(ll k,int m,int p){
20 if (k<=n){
21 for(int i=0;i<k;i++)ans[s[i]-'a']+=p;
22 return;
23 }
24 while (len[m]>k)m--;
25 for(int i=0;i<26;i++)ans[i]+=sum[m][i]*p;
26 calc2(k-len[m],m,p);
27 }
28 int main(){
29 scanf("%s%lld%lld",s,&l,&r);
30 n=strlen(s);
31 nex[0]=nex[1]=0;
32 for(int i=1,j=0;i<n;i++){
33 while ((j)&&(s[j]!=s[i]))j=nex[j];
34 if (s[j]==s[i])j++;
35 nex[i+1]=j;
36 }
37 int nn=n;
38 while (2*n>=nn)n=nex[n];
39 n=nn-n;
40 nex[n]=n-nex[n];
41 if (n%nex[n]==0){
42 calc1(r,1);
43 calc1(l-1,-1);
44 for(int i=0;i<26;i++)printf("%lld ",ans[i]);
45 return 0;
46 }
47 len[0]=n;
48 for(int i=0;i<n;i++)sum[0][s[i]-'a']++;
49 len[1]=n+nex[n];
50 for(int i=0;i<n;i++)sum[1][s[i]-'a']++;
51 for(int i=0;i<nex[n];i++)sum[1][s[i]-'a']++;
52 m=1;
53 while (len[m]<r){
54 m++;
55 len[m]=len[m-1]+len[m-2];
56 for(int i=0;i<26;i++)sum[m][i]=sum[m-1][i]+sum[m-2][i];
57 }
58 calc2(r,m,1);
59 calc2(l-1,m,-1);
60 for(int i=0;i<26;i++)printf("%lld ",ans[i]);
61 }
[atARC077F]SS的更多相关文章
- 极路由2(极贰)在OpenWrt下定制自己的ss服务
默认刷入的OpenWrt带的ss, 只有ss-redir服务, 但是在实际使用中, 很多时候还是希望访问直接通过正常网关, 只有少部分访问需要通过ss, 所以希望能配置成为ss-local服务. 在保 ...
- 记一次ss故障
本文主要参考: https://github.com/shadowsocks/shadowsocks shadowssocks 分为客户端和服务器端. 我们平时买的服务,使用是要用的是客户端. 如果你 ...
- ss命令和Recv-Q和Send-Q状态
ss 用来显示处于活动状态的套接字信息.ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比nets ...
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
java日期格式大全 format SimpleDateFormat(转) SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH ...
- SS - DIY一个前端模板引擎.(一)
前端MVVM 模式有点很多,完全摆脱了意大利面条式的代码. 个人认为,所有MVVM 的框架基础就是一个高性能的JS模板引擎,它极大简化了 DOM 操作, 使页面渲染和业务逻辑彻底分离. 为了理解模板引 ...
- YYYY-mm-dd HH:MM:SS
备忘:YYYY-mm-dd HH:MM:SS部分解释 d 月中的某一天.一位数的日期没有前导零. dd 月中的某一天.一位数的日期有一个前导零 ...
- js 获取当前日期时间3种格式化方法 yyyy-mm-dd hh:MM:ss
方法一: Date.prototype.format = function (format) { var args = { "M+": this.getMonth() + 1, & ...
- 在VPS上搭建SS访问火星
前段时间发布了Visual Studio 2017 RC,由于现在VS没有离线的ISO了,只有一个在线安装文件.虽然可以通过这个在线安装文件生成完整的离线安装包(之前的ISO版本在安装过程中仍然需要联 ...
- 每天一个linux命令(57):ss命令
ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的 ...
随机推荐
- JVM学习笔记——GC垃圾收集器
GC 垃圾收集器 Java 堆内存采用分代回收算法,因此 JVM 针对新生代和老年代提供了多种垃圾收集器. 1. Serial 收集器 Serial 收集器是单线程收集器,采用复制算法. 是最基本的垃 ...
- 【.Net vs Java? 】 先来看一下Java和C#的数据类型区别。
新工作.Net和Java都要做,早期也做过一段Java的项目,但没有系统的深入学习过.一直觉得这两门语言估计是最相近的两门语言了,好多代码可以说直接拷过来都不带报错的,但仔细推敲还是有很多的不同. 1 ...
- java语言程序设计与数据结构(基础篇)第二章答案
答案为本人自己求解,若有错误,还望海涵并及时告知.如有雷同,纯属巧合. 2.1 import java.util.Scanner; public class Welcome { public stat ...
- 洛谷4234最小差值生成树 (LCT维护生成树)
这也是一道LCT维护生成树的题. 那么我们还是按照套路,先对边进行排序,然后顺次加入. 不过和别的题有所不同的是: 在本题中,我们需要保证LCT中正好有\(n-1\)条边的时候,才能更新\(ans\) ...
- 好程序员打造核心教培天团,着力培养IT高级研发人才
随着数字化进程加快,各行各业数字化转型迫在眉睫,技术人才战略成为企业发力重点,IT高级研发人才已经成为企业的"核心资产",对企业发展起关键性作用,然而市场上高级研发人才极为稀缺.据 ...
- 【Takin使用日记】记一次TransmittableThreadLocal引起的业务异常
对于常见的 WEB 容器,Takin 通过增强 org.apache.catalina.core.StandardHostValve#invoke 方法,拦截并解析方法入参的 Request 对象中的 ...
- 从浏览器发送请求给SpringBoot后端时,是如何准确找到哪个接口的?(下篇)
纸上得来终觉浅,绝知此事要躬行 注意: 本文 SpringBoot 版本为 2.5.2; JDK 版本 为 jdk 11. 前言: 前文:你了解SpringBoot启动时API相关信息是用什么数据结构 ...
- SpringBoot小知识点
记录SpringBoot的小知识点 一.在 Spring 上下文刷新之前设置一些自己的环境变量 1.实现 EnvironmentPostProcessor 接口 2.spring.factories ...
- 2021.7.28考试总结[NOIP模拟26]
罕见的又改完了. T1 神炎皇 吸取昨天三个出规律的教训,开场打完T2 20pts直接大力打表1h. 但怎么说呢,我不懂欧拉函数.(其实exgcd都忘了 于是只看出最大平方因子,不得不线性筛,爆拿60 ...
- The entitlements specified in your application’s Code Signing Entitlements file do not match those s
今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...