#include<bits/stdc++.h>
#define fi first
#define se second
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3f
#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define pqueue priority_queue
#define NEW(a,b) memset(a,b,sizeof(a))
const double pi=4.0*atan(1.0);
const double e=exp(1.0);
const int maxn=4e5+;
typedef long long LL;
typedef unsigned long long ULL;
const LL mod=1e9+;
const ULL base=1e7+;
const int maxp=+;
using namespace std;
struct Suffix_Node{
int ch[maxp],par,len,jg;
LL dd[];
void init(){
NEW(ch,);
par=len=;
}
};
int num[maxn];
int la[maxn],ra[maxn];
int st[maxn];
int n,k;
ULL ans[maxn];
pair<ULL,int> w[maxn];
class Suffix_Automation{
private:
Suffix_Node s[maxn];
int cur,las,siz,crp,dx;
vector<int> gg[maxn];
struct node{
int to,nxt;
}g[maxn];
int cnt,head[maxn],pk[maxn];
public:
Suffix_Automation():las(),cur(),siz(),crp(){}
const void init(){
for(int i=;i<=siz;i++) {
pk[i]=;s[i].init();
for(int j=;j<=;j++) s[i].dd[j]=;
gg[i].clear();
ans[i]=;
for(int j=;j<;j++){
f[i][j]=;
}
}
las=cur=siz=crp=;
cnt=;
head[]=head[]=-;
dx=;
}
const int match(const char c)const{
return s[crp].ch[c-'a'];
}
const void withdraw(const int len){
while(crp!=&&s[s[crp].par].len>=len) crp=s[crp].par;
if(crp==) crp=;
}
const void Transfer(const int len,const char c){
crp=s[crp].ch[c-'a'];
if(crp==) crp=;
withdraw(len);
}
const void ex_tend(const char c){
int x=c-'a';
cur=++siz;
head[siz]=-;
s[cur].len =s[las].len+;
s[cur].jg=;
while(las!=&&!s[las].ch[x])
s[las].ch[x]=cur,las=s[las].par;
if(las==) s[cur].par=;
else{
int q,nq;
q=s[las].ch[x];
if(s[q].len==s[las].len+)
s[cur].par=q;
else{
nq=++siz;
head[siz]=-;
s[nq]=s[q],s[nq].len=s[las].len+;
s[nq].jg=;
s[cur].par=s[q].par=nq;
while(las!=&&s[las].ch[x]==q)
s[las].ch[x]=nq,las=s[las].par;
}
}
las=cur;
}
void dfs(int u){
if(f[u][]) return ;
add(s[u].par,u);
if(s[u].par!=){
dfs(s[u].par);
}
f[u][]=s[u].par;
}
void solve(){
for(int i=;i<=siz;i++){
if(!f[i][]){
dfs(i);
}
}
for(int j=;j<;j++){
for(int i=;i<=siz;i++){
f[i][j]=f[f[i][j-]][j-];
}
}
}
void add(int x,int y){
g[cnt].to=y;
g[cnt].nxt=head[x];
head[x]=cnt++;
}
int f[maxn][];
int d[maxn];
int fid(int u,int le){
int y;
for(int j=;j>=;j--){
y=f[u][j];
if(y!=&&s[y].len>=le){
u=y;
}
}
return u;
}
void dfs2(int u,int fa){
d[u]=d[fa]+;
la[u]=dx+;
if(pk[u]!=){
dx++;
num[dx]=pk[u];
}
for(int i=head[u];i!=-;i=g[i].nxt){
if(g[i].to!=fa){
dfs2(g[i].to,u);
s[u].jg+=s[g[i].to].jg;
}
}
ra[u]=dx;
gg[s[u].jg].push_back(u);
}
int get_dx(){
return dx;
}
void ins(int x){
pk[crp]=x;
st[x]=crp;
}
void sss(){
for(int i=n;i>=;i--){
for(int j=;j<gg[w[i].se].size();j++){
int y=gg[w[i].se][j];
while(y)
{
LL er=w[i].fi,flag=;
for(int j=;j>=;j--)
{
if(!(er>>j)) continue;
if(!s[y].dd[j]) {s[y].dd[j]=er;flag=;break;}
er^=s[y].dd[j];
}
if(!flag) break;
ans[y]+=w[i].fi;y=s[y].par;
}
} }
} }SAM;
char ss[maxn];
int main(){
int t;
scanf("%d",&t);
int x,y,z;
int ai;
int gh;
while(t--){
SAM.init();
scanf("%d",&n);
scanf("%s",ss);
for(int i=;i<=n;i++){
scanf("%llu",&w[i].fi);
w[i].se=i;
}
sort(w+,w++n);
for(int i=;ss[i];i++){
SAM.ex_tend(ss[i]);
}
SAM.solve();
for(int i=;ss[i];i++){
SAM.Transfer(i+,ss[i]);
SAM.ins(i+);
}
SAM.dfs2(,);
scanf("%d",&k);
int g=SAM.get_dx();
SAM.sss();
while(k--){
scanf("%d%d",&x,&y);
x=y-x+;
z=SAM.fid(st[y],x);
printf("%llu\n",ans[z]);
}
}
}

http://acm.hdu.edu.cn/showproblem.php?pid=6694

后缀自动机求endpos集大小的更多相关文章

  1. 后缀自动机求字典序第k小的串——p3975

    又领悟到了一点新的东西,后缀自动机其实可以分为两个数据结构,一个是后缀树,还有一个是自动机 后缀树用来划分endpos集合,并且维护后缀之间的关系,此时每个结点代表的是一些后缀相同且长度连续的子串 自 ...

  2. SETI ACdream - 1430 后缀自动机求不相交子串

    http://blog.csdn.net/gatevin/article/details/45875343 题目是求不重叠的不同子串个数 一般来说, endpos集合包含了子串结尾位置,结尾在&quo ...

  3. 洛谷P4248 [AHOI2013]差异(后缀自动机求lcp之和)

    题目见此 题解:首先所有后缀都在最后一个np节点,然后他们都是从1号点出发沿一些字符边到达这个点的,所以下文称1号点为根节点,我们思考一下什么时候会产生lcp,显然是当他们从根节点开始一直跳相同节点的 ...

  4. Alice's Classified Message HDU - 5558 后缀自动机求某个后缀出现的最早位置

    题意: 给定一个长度不超过 10W 的只包含小写字母的字符串,从下标 0 到 n−1.从下标 0 开始操作, 每次对于下标 pos查找下标 pos 开始的子串中最长的在其他地方出现过的长度,其他出现的 ...

  5. str2int HDU - 4436 后缀自动机求子串信息

    题意: 给出 n 个串,求出这 n 个串所有子串代表的数字的和. 题解; 首先可以把这些串构建后缀自动机(sam.last=1就好了), 因为后缀自动机上从 root走到的任意节点都是一个子串,所有可 ...

  6. BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串

    http://www.lydsy.com/JudgeOnline/problem.php?id=3998 后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串 ...

  7. CodeForces-204E:Little Elephant and Strings (广义后缀自动机求出现次数)

    The Little Elephant loves strings very much. He has an array a from n strings, consisting of lowerca ...

  8. 洛谷 P1368 工艺 后缀自动机 求最小表示

    后缀自动机沙茶题 将字符串复制一次,建立后缀自动机. 在后缀自动机上贪心走 $n$ 次即可. Code: #include <cstdio> #include <algorithm& ...

  9. HDU 4641 K-string 后缀自动机 并查集

    http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...

随机推荐

  1. [转帖]CentOS 8 正式发布

    CentOS 8 正式发布   终于发布了.. https://news.cnblogs.com/n/640416/ 前几天刚弄完centos7.7 的环境. CentOS 8 官方正式发布了!!!C ...

  2. java源码--Map

    Map接口 用于保存具有映射关系的数据结构,实现该接口的类可以通过键来获取对应的值.. 可以将给定一个键值对存储在Map接口的实现类实例中,如:map.put("key", &qu ...

  3. Java:HashMap的实现原理(JDK1.8)

    1.    HashMap概述: HashMap是基于哈希表的Map接口的非同步实现.此实现提供所有可选的映射操作,并允许使用null值和null键.此类不保证映射的顺序,特别是它不保证该顺序恒久不变 ...

  4. Python turtle(介绍一)

    关于绘制图形库turtle # 画布上,默认有一个坐标原点为画布中心的坐标轴(0,0),默认"standard"模式坐标原点上有一只面朝x轴正方向小乌龟 一:海龟箭头Turtle相 ...

  5. 使用 jsvc 启动tomcat(使用普通用户运行)

    使用 jsvc 启动tomcat(使用普通用户运行) jsvc简介 在生产中,tomcat应该以daemon的模式运行,而且如果需要以普通用户的身份启动tomcat,那么就不能使用1024以下的端口, ...

  6. 本地Pycharm将spark程序发送到远端spark集群进行处理

    前言 最近在搞hadoop+spark+python,所以就搭建了一个本地的hadoop环境,基础环境搭建地址hadoop2.7.7 分布式集群安装与配置,spark集群安装并集成到hadoop集群, ...

  7. Luogu5327 ZJOI2019语言(树上差分+线段树合并)

    暴力树剖做法显然,即使做到两个log也不那么优美. 考虑避免树剖做到一个log.那么容易想到树上差分,也即要对每个点统计所有经过他的路径产生的总贡献(显然就是所有这些路径端点所构成的斯坦纳树大小),并 ...

  8. (五)web服务中的异常处理

    一.服务端发布服务 package com.webservice; import javax.jws.WebParam; import javax.jws.WebResult; import java ...

  9. ubuntu14.04 caffe

    1.显卡驱动 ubuntu nvidia 940m 使用sudo ubuntu-drivers devices 查看推荐的驱动版本 //sudo add-apt-repository ppa:mama ...

  10. VS2019编译 当前最新版chromium

    之前编译过webrtc和chromium, 由于长时间没用,被我删除了, 最近在最新版本的google浏览器上遇到了播放器兼容性问题,老版本的google浏览器是没问题,IE, 火狐浏览器也没问题, ...