String and Times

时间限制: 1 Sec  内存限制: 128 MB

题目描述

Now you have a string consists of uppercase letters, two integers A and B. We call a substring wonderful substring when the times it appears in that string is between A and B (A ≤ times ≤ B). Can you calculate the number of wonderful substrings in that string?

输入

Input has multiple test cases.
For each line, there is a string S, two integers A and B.
∑Length(S)≤2×10^6,1≤A≤B≤length(S) 

输出

For each test case, print the number of the wonderful substrings in a line.

样例输入

AAA 2 3
ABAB 2 2

样例输出

2
3

题意:给定字符串,求出现次数在[l,r]内的不同字符串的个数。
思路:首先考虑求出现次数大于等于k次的字符串个数。后缀数组的height数组的定义为某个后缀串和它前一个后缀串(此处“前一个”意思是按照字典序的排名来的前一个)的最长公共前缀,那么height数组里若有连续的k-1个数的最小值为min,就代表有一个长度为min的字符串最少出现了k次。
#include<bits/stdc++.h>
#define INF LLONG_MAX/2
#define lson (rt*2)
#define rson (rt*2+1)
using namespace std;
const int N = 2e5+;
char s[N]; struct SuffixArray
{
int sa[N],rank[N],height[N],cnt[N],a1[N],a2[N],n,m,*x,*y;
void sort()
{
for(int i=; i<m; i++) cnt[i]=;
for(int i=; i<n; i++) cnt[x[i]]++;
for(int i=; i<m; i++) cnt[i]+=cnt[i-];
for(int i=n-; i>=; i--) sa[--cnt[x[y[i]]]]=y[i];
}
void build(char *s,int c_size)
{
n=strlen(s);
m=c_size;
x=a1;
y=a2;
for(int i=; i<n; i++) x[i]=s[i],y[i]=i;
x[n]=y[n]=-;
sort();
for(int k=; k<=n; k<<=)
{
int p=;
for(int i=n-k; i<n; i++) y[p++]=i;
for(int i=; i<n; i++) if(sa[i]>=k) y[p++]=sa[i]-k;
sort();
p=;
std::swap(x,y);
x[sa[]]=;
for(int i=; i<n; i++)
{
if(y[sa[i]]!=y[sa[i-]]||y[sa[i]+k]!=y[sa[i-]+k]) p++;
x[sa[i]]=p;
}
if(p+>=n) break;
m=p+;
}
for(int i=; i<n; i++) rank[sa[i]]=i;
height[]=;
int k=;
for(int i=; i<n; i++)
{
if(k) k--;
if(rank[i]==) continue;
int j=sa[rank[i]-];
while(i+k<n&&j+k<n&&s[i+k]==s[j+k]) k++;
height[rank[i]]=k;
}
}
} SA; struct node
{
long long val;
int l,r;
}tree[N<<];
void build(int rt,int l,int r)
{
int mid=(l+r)>>;
tree[rt].l=l,tree[rt].r=r;
tree[rt].val=INF;
if(l==r)
{
tree[rt].val=SA.height[l];
return ;
}
build(lson,l,mid);
build(rson,mid+,r);
tree[rt].val=min(tree[lson].val,tree[rson].val);
}
int query(int rt,int l,int r)
{
int mid=(tree[rt].l+tree[rt].r)/;
if(tree[rt].l==l&&tree[rt].r==r)return tree[rt].val;
if(r<=mid)return query(lson,l,r);
else
if(l>mid)return query(rson,l,r);
else
return min(query(lson,l,mid),query(rson,mid+,r));
} long long cal(int k,int n) //求出现k次以上的字符串的个数
{
long long ans=;
if(k==)
{
for(int i=;i<n;i++) ans+=(n-SA.sa[i]-SA.height[i]);
return ans;
}
int l=,r=+k-;
int pre=;
while(r<n)//处理全部长度为k-1的连续区间
{
int now=query(,l,r);
if(now>=pre) ans+=now-pre;//要注意减去上一个区间的贡献
pre=now;
l++,r++;
}
return ans;
}
int main()
{
while(scanf("%s",s)!=EOF)
{
int L,R;
scanf("%d%d",&L,&R);
int ls=strlen(s);
SA.build(s,);
build(,,ls-);
printf("%lld\n",cal(L,ls)-cal(R+,ls));
}
return ;
}
 

String and Times的更多相关文章

  1. 透过WinDBG的视角看String

    摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...

  2. JavaScript String对象

    本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...

  3. ElasticSearch 5学习(9)——映射和分析(string类型废弃)

    在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...

  4. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  5. js报错: Uncaught RangeError: Invalid string length

    在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...

  6. c# 字符串连接使用“+”和string.format格式化两种方式

    参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...

  7. 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed

    之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...

  8. JavaScript中String对象的方法介绍

    1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...

  9. 在多线程编程中lock(string){...}隐藏的机关

    常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...

  10. BCL中String.Join的实现

    在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...

随机推荐

  1. vue 图片懒加载v-lazy

    搬运自:https://blog.csdn.net/twodogya/article/details/80223331 vue v-lazy官方API:https://www.npmjs.com/pa ...

  2. 海量可视化日志分析平台之ELK搭建

    ELK是什么? E=ElasticSearch ,一款基于的Lucene的分布式搜索引擎,我们熟悉的github,就是由ElastiSearch提供的搜索,据传已经有10TB+的数据量. L=LogS ...

  3. cv2 & PIL(pillow)显示图像

    = OpenCV和PIL中显示图像方式不一样,且支持的格式也不同 = cv在显示图像时是自定义的显示窗口,而PIL中显示是调用操作系统中的默认打开程序 如: import cv2 im = cv2.i ...

  4. 【笔记篇】C#笔记3

    笔记目录:http://blog.csdn.net/enzymii/article/details/77169928 C#的接口有点意思,我们说过可以用来多重继承.. using System; na ...

  5. [JZOJ6011] 【NOIP2019模拟1.25A组】天天爱跑步

    题目 描述 题目大意 给你平面直角坐标系上的nnn个起点和nnn个终点,(x,y)(x,y)(x,y)每次只能走到(x,y+x)(x+y,y)(x,y−x)(x−y,y)(x,y+x)(x+y,y)( ...

  6. 廖雪峰Java11多线程编程-3高级concurrent包-6ExecutorService

    Java语言内置多线程支持: 创建线程需要操作系统资源(线程资源,栈空间) 频繁创建和销毁线程需要消耗大量时间 如果可以复用一个线程 线程池: 线程池维护若干个线程,处于等待状态 如果有新任务,就分配 ...

  7. BCB怎么调用DLL中的函数

    推荐你看<BCB编写DLL终极手册>这篇文章如下片段:二. 静态调用 DLL使用 $BCB path\Bin\implib.exe 生成 Lib 文件,加入到工程文件中将该文件拷贝到当前目 ...

  8. DuiLib学习笔记2.写一个简单的程序

    我们要独立出来自己创建一个项目,在我们自己的项目上加皮肤这才是初衷.我的新建项目名为:duilibTest 在duilib根目录下面有个 Duilib入门文档.doc 我们就按这个教程开始入门 首先新 ...

  9. SpringData_03_Specifications动态查询

    有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data JPA中可以通过JpaSpecificationExecutor接口查询.相比JPQL, ...

  10. iOS开发本地推送

    1.简介 本地通知是由本地应用触发的,它是基于时间行为的一种通知形式,例如闹钟定时.待办事项提醒,又或者一个应用在一段时候后不使用通常会提示用户使用此应用等都是本地通知. 2.创建UILocalNot ...