String and Times
String and Times
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入
For each line, there is a string S, two integers A and B.
∑Length(S)≤2×10^6,1≤A≤B≤length(S)
输出
样例输入
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的更多相关文章
- 透过WinDBG的视角看String
摘要 : 最近在博客园里面看到有人在讨论 C# String的一些特性. 大部分情况下是从CODING的角度来讨论String. 本人觉得非常好奇, 在运行时态, String是如何与这些特性联系上的 ...
- JavaScript String对象
本编主要介绍String 字符串对象. 目录 1. 介绍:阐述 String 对象的说明以及定义方式. 2. 实例属性:介绍 String 对象的实例属性: length. 3. 实例方法:介绍 St ...
- ElasticSearch 5学习(9)——映射和分析(string类型废弃)
在ElasticSearch中,存入文档的内容类似于传统数据每个字段一样,都会有一个指定的属性,为了能够把日期字段处理成日期,把数字字段处理成数字,把字符串字段处理成字符串值,Elasticsearc ...
- [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密
string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...
- js报错: Uncaught RangeError: Invalid string length
在ajax请求后得到的json数据,遍历的时候chrome控制台报这个错误:Uncaught RangeError: Invalid string length,在stackoverflow查找答案时 ...
- c# 字符串连接使用“+”和string.format格式化两种方式
参考文章:http://www.liangshunet.com/ca/201303/218815742.htm 字符串之间的连接常用的两种是:“+”连接.string.format格式化连接.Stri ...
- 【手记】注意BinaryWriter写string的小坑——会在string前加上长度前缀length-prefixed
之前以为BinaryWriter写string会严格按构造时指定的编码(不指定则是无BOM的UTF8)写入string的二进制,如下面的代码: //将字符串"a"写入流,再拿到流的 ...
- JavaScript中String对象的方法介绍
1.字符方法 1.1 charAt() 方法,返回字符串中指定位置的字符. var question = "Do you like JavaScript?"; alert(ques ...
- 在多线程编程中lock(string){...}隐藏的机关
常见误用场景:在订单支付环节中,为了防止用户不小心多次点击支付按钮而导致的订单重复支付问题,我们用 lock(订单号) 来保证对该订单的操作同时只允许一个线程执行. 这样的想法很好,至少比 lock( ...
- BCL中String.Join的实现
在开发中,有时候会遇到需要把一个List对象中的某个字段用一个分隔符拼成一个字符串的情况.比如在SQL语句的in条件中,我们通常需要把List<int>这样的对象转换为“1,2,3”这样的 ...
随机推荐
- python基础语法(数据类型转换)
- webpack 简单笔记(三)vue-cli 使用 webpack-bundle-analyzer 分析
当我们使用CommonsChunkPlugin插件时可以使用webpack-bundle-analyzer插件来分析分块是否达到我们的目地 安装 npm install --save-dev webp ...
- Codeforces 388D Fox and Perfect Sets
链接:CF388D 题目大意 给定一个数\(n\),求选择\(0 \sim n\)中任意个数的数字组成的集合\(S\)中,有多少满足若\(a\in S,b\in S\),则\(a \bigoplus ...
- PostgreSQL:COALESCE函数
COALESCE函数是返回参数中的第一个非null的值,它要求参数中至少有一个是非null的,如果参数都是null会报错. select COALESCE(null,null); //报错 selec ...
- leetcode-95-不同的二叉搜索树(卡特兰数)
题目描述: 方法一:动态规划 O(n^2) O(n) class Solution: def numTrees(self, n: int) -> int: dp = [0]*(n+1) dp[0 ...
- 廖雪峰Java11多线程编程-3高级concurrent包-3Condition
Condition实现等待和唤醒线程 java.util.locks.ReentrantLock用于替代synchronized加锁 synchronized可以使用wait和notify实现在条件不 ...
- csp-s模拟64trade,sum,building题解
题面:https://www.cnblogs.com/Juve/articles/11639755.html trade: 70分sbdp,然后一直想优化,dp还是很好写的 正解是反悔贪心 维护一个小 ...
- maven相互依赖导致无法编译成功
起初是新加了个模块,启动前编译时error,提示找不到依赖模块的类,但java文件上是没有报错的. 后经过排查,发现是循环依赖导致的此问题. 如图,弹出框中有循环依赖的模块会显示红色,右键Open M ...
- Vue Element 使用 icon 图标 (第三方)
Vue Element 使用 icon 图标 (第三方) element-ui 自带的图标库还是不够全, 还是需要需要引入第三方 icon, 自己在用的时候一直有些问题, 参考了些教程, 详细地记录补 ...
- Ubuntu 12.04 Eclipse设置 Javadoc背景色
在Ambiance主题下,eclipse弹出的tip是黑色背景的,这样压根就看不清java doc. 当然可以在外观改变系统主题为其他主题,相应的gtk-2.0/gtkrc要重新设置,比如Ubuntu ...