后缀自动机求endpos集大小
#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集大小的更多相关文章
- 后缀自动机求字典序第k小的串——p3975
又领悟到了一点新的东西,后缀自动机其实可以分为两个数据结构,一个是后缀树,还有一个是自动机 后缀树用来划分endpos集合,并且维护后缀之间的关系,此时每个结点代表的是一些后缀相同且长度连续的子串 自 ...
- SETI ACdream - 1430 后缀自动机求不相交子串
http://blog.csdn.net/gatevin/article/details/45875343 题目是求不重叠的不同子串个数 一般来说, endpos集合包含了子串结尾位置,结尾在&quo ...
- 洛谷P4248 [AHOI2013]差异(后缀自动机求lcp之和)
题目见此 题解:首先所有后缀都在最后一个np节点,然后他们都是从1号点出发沿一些字符边到达这个点的,所以下文称1号点为根节点,我们思考一下什么时候会产生lcp,显然是当他们从根节点开始一直跳相同节点的 ...
- Alice's Classified Message HDU - 5558 后缀自动机求某个后缀出现的最早位置
题意: 给定一个长度不超过 10W 的只包含小写字母的字符串,从下标 0 到 n−1.从下标 0 开始操作, 每次对于下标 pos查找下标 pos 开始的子串中最长的在其他地方出现过的长度,其他出现的 ...
- str2int HDU - 4436 后缀自动机求子串信息
题意: 给出 n 个串,求出这 n 个串所有子串代表的数字的和. 题解; 首先可以把这些串构建后缀自动机(sam.last=1就好了), 因为后缀自动机上从 root走到的任意节点都是一个子串,所有可 ...
- BZOJ 3998: [TJOI2015]弦论 后缀自动机 后缀自动机求第k小子串
http://www.lydsy.com/JudgeOnline/problem.php?id=3998 后缀自动机应用的一个模板?需要对len进行一个排序之后再统计每个出现的数量,维护的是以该字符串 ...
- CodeForces-204E:Little Elephant and Strings (广义后缀自动机求出现次数)
The Little Elephant loves strings very much. He has an array a from n strings, consisting of lowerca ...
- 洛谷 P1368 工艺 后缀自动机 求最小表示
后缀自动机沙茶题 将字符串复制一次,建立后缀自动机. 在后缀自动机上贪心走 $n$ 次即可. Code: #include <cstdio> #include <algorithm& ...
- HDU 4641 K-string 后缀自动机 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...
随机推荐
- HTTP最常见的响应头
HTTP最常见的响应头如下所示: l Allow:服务器支持哪些请求方法(如GET.POST等): l Content-Encoding:文档的编码(Encode)方法 ...
- 使用 IDEA 创建 maven 项目
文章目录 第一步 第二步 第三步 目录结构的设置 看下 web.xml 配置文件 第一步 点击 maven : 勾选从模板创建 : 选择 webapp : 第二步 第三步 如果你自己对 maven 进 ...
- 使用google的guova开发高并发下的接口限流
使用google的guova开发高并发下的接口限流 使用google的guova进行限流 1.guova的限流方式,在定时产生定量的令牌,令牌的数量限制了流量 2.增加一个订单接口限流类OrderRa ...
- Python习题005
作业一 :任意一个数字列表,然后进行排序(冒泡排序) 方法一: def test1(): list1 = [1,23,4,6,8,55,2,9,90,35] list1.sort() # sort() ...
- Python笔记004-Python最基本内置数据类型和运算符
第二章(1)Python编程基础概念 1. 最基本内置数据类型和运算符 每个对象都有类型,Python 中最基本的内置数据类型: 1. 整数 整数,2345 ,10 ,50 2. 浮点型 小数,3.1 ...
- 20190621-N皇后
N皇后 难度分类 困难 题目描述 n皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n ...
- nginx设置导航&安装showdoc&创建文件服务&zabbix&grafana
安装环境: [root@nginx showdoc]# cat /etc/centos-release #系统版本 CentOS Linux release 7.5.1804 (Core) [root ...
- egret 微信小游戏 错误
1,使用jszip错误 (1) t.createElementNS is not a function 修改:webapp-adapter.js,增加一个方法 createElementNS: f ...
- qt聊天室bug-- error: no matching function for call to 'Ui::Widget::setupUi(Widget*)' ui->setupUi(this); ^
- JS 06 bom 框窗_页面_定时任务
BOM(Broswer Object Model) 凡是 window 的属性和方法,均可以省略“window.” 方法: 框窗 1.警告框 window.alert("msg") ...