#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. [转帖]如何保护你的 Python 代码 (一)—— 现有加密方案

    如何保护你的 Python 代码 (一)—— 现有加密方案 Prodesire Python猫 1周前

  2. 【牛客网】Finding Hotel

    [牛客网]Finding Hotel 忘记K远点对的剪枝的我有点自闭 事实上我们只要先建一棵KD树出来,维护一下所在的矩形,和子树里的最小值 每次查询的时候如果最小值比查询的值要大的话就退出 当前的答 ...

  3. python基础学习记录......

    1.IDEA写python 打开IDEA,File--->settings---->Plugins    输入python  安装   重启IDEA 2.新建Project     选择P ...

  4. windows MinGW gcc 编译乱码问题

    问题描述 一般很多编辑器默认都是保存成utf-8文件,然而在输出中文的时候出现了乱码?另外试了其他方法,有的乱码,有的不乱? MinGW gcc 编译 utf-8 文件的时候乱码 MinGW gcc ...

  5. Django 1.8.2 admin 数据库操作按下保存按钮出错

    Django报错:Runtimeerror: generator raised StopIteration python版本太新不兼容照成,下载python3.6就行了

  6. PHP7有没有你们说的那么牛逼

    男人不能快,但程序一定要快.PHP7到底快不快,我们拭目以待. PHP7来一发 PHP7正式发布到现在已经一年半了,刚出道就号称比旧版本快了几倍,各种开源框架或系统运行在PHP7上速度效率提高了几倍, ...

  7. 定时任务FluentScheduler

    1.Nuget 安装包 2.创建3个不同的任务 public class MyJob : IJob { void IJob.Execute() { Trace.WriteLine("现在时间 ...

  8. Asp.Net Core 存储Cookie 的问题

    Asp.Net Core 2.1生成的项目模板默认实现了<欧洲常规数据保护法规 (GDPR)>支持.这就使得我们的程序要想成功的存储除了用户身份以外的cookie通常是需要用户同意的. 3 ...

  9. IOC实现-Unity

    .NET中实现IOC有很多方式,比如:Unity.Ninject.Autofac.MEFNinject的实现参考<Pro ASP.NET MVC3.5 FrameWork>下面给出的是Un ...

  10. AI 公司与比赛

    科大讯飞 网站:https://www.iflytek.com/ 比赛:http://challenge.xfyun.cn/2019/ AI 大学:https://www.aidaxue.com/ 华 ...