#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. 【Docker】:使用docker安装mysql,挂载外部配置和数据

    普通安装 1.下载镜像,mysql 5.7 docker pull mysql:5.7 2.创建mysql容器,并后台启动 docker run -d -p 3306:3306 -e MYSQL_US ...

  2. C++ algorithm算法库

    C++ algorithm算法库 Xun 标准模板库(STL)中定义了很多的常用算法,这些算法主要定义在<algorithm>中.编程时,只需要在文件中加入#include<algo ...

  3. 20191011-构建我们公司自己的自动化接口测试框架-Util的getTestSuite模块

    getTestSuite主要是用于在testData里面获取测试集以及对应的测试数据,包括2个主要的方法,一个是获取测试集,一个是获取测试集里面要执行的测试用例 获取测试集方法: from Util. ...

  4. asp.net core-14.JWT认证授权 生成 JWT Token

    源码下载 语言组织能力不好 ,看这个 视频 用visual studio code打开文件,运行dotnet watch run 之后在postman里面去访问 拿到Token后

  5. Manacher算法+注释

    Manacher算法是用来求一个字符串中最长回文串的算法. 考虑暴力求最长回文串的做法: 暴力枚举字符串中的所有字串判断是否回文,然后求最大值. 时间复杂度O(n^3),考虑优化. 我们从枚举所有字串 ...

  6. Java Web 修改请求参数

    方法一.继承 HttpServletRequestWrapper , 实现自定义 request 1.除了修改的参数,其他 Header 等参数不变, 等同于修改了请求参数 2.实质是另一个请求 /* ...

  7. LinearSearch Java

    Java LinearSearch /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternation ...

  8. pytorch报错:AttributeError: 'module' object has no attribute '_rebuild_tensor_v2'

    转载自: https://blog.csdn.net/qq_24305433/article/details/80844548 由于训练模型时使用的是新版本的pytorch,而加载时使用的是旧版本的p ...

  9. 二、运行时JVM结构组成及作用

    二.运行时JVM结构组成及作用 程序计数器 是否共享:否,线程私有,每个线程有1个独立的程序计数器! 所处位置:线程私有的内部区域 生命周期:与线程绑定 主要作用: 当前线程执行字节码的行号指示器!  ...

  10. ipp 实现图像空间的转换

    下载:https://software.intel.com/en-us/parallel-studio-xe/choose-download/free-trial-cluster-windows-c- ...