bzoj3879
题解:
后缀数组
然后把读入的内容去重,按照rank排序
然后用单调栈处理一下
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=;
const ll M=23333333333333333ll;
int r[N],ra[N],rb[N],a,st[N],h[N],sa[N],rank[N],n,m,Q;
int q[N],t,ls[N],rs[N],f[N][],Log[N],vis[N],v[N],s[N];
ll ans;
char str[N];
void build()
{
int *x=ra,*y=rb;
for (int i=;i<n;i++)st[x[i]=r[i]]++;
for (int i=;i<m;i++)st[i]+=st[i-];
for (int i=n-;i>=;i--) sa[--st[x[i]]]=i;
for (int j=,p=;p<n;j<<=,m=p)
{
p=;
for (int i=n-j;i<n;i++)y[p++]=i;
for (int i=;i<n;i++)
if (sa[i]>=j)y[p++]=sa[i]-j;
for (int i=;i<m;i++)st[i]=;
for (int i=;i<n;i++)st[x[y[i]]]++;
for (int i=;i<m;i++)st[i]+=st[i-];
for (int i=n-;i>=;i--)sa[--st[x[y[i]]]]=y[i];
swap(x,y);x[sa[]]=;
for (int i=p=;i<n;i++)
x[sa[i]]=(y[sa[i]]==y[sa[i-]]&&y[sa[i]+j]==y[sa[i-]+j])?p-:p++;
}
for (int i=;i<n;i++)rank[sa[i]]=i;
for (int i=,k=;i<n-;h[rank[i++]]=k)
{
if (k)k--;
for (int j=sa[rank[i]-];r[i+k]==r[j+k];k++);
}
}
int cmp(int a,int b){return rank[a]<rank[b];}
int query(int a,int b)
{
int k=Log[b-a+];
return min(f[a][k],f[b-(<<k)+][k]);
}
int main()
{
scanf("%d%d%s",&n,&Q,str);
for (int i=;i<n;i++)r[i]=str[i]-'a'+;
n++;m=;build();n--;
for (int i=;i<=n;i++)f[i][]=h[i];
for (int j=;(<<j)<n;j++)
for (int i=;i+(<<j)-<=n;i++)f[i][j]=min(f[i][j-],f[i+(<<j-)][j-]);
for (int i=;i<=n;i++)Log[i]=Log[i>>]+;
while (Q--)
{
scanf("%d",&a);
for (int j=;j<=a;j++)
{
scanf("%d",&v[j]);
v[j]--;
if (vis[v[j]])j--,a--;
vis[v[j]]=;
}
sort(v+,v+a+,cmp);
for (int j=;j<a;j++)s[j]=query(rank[v[j]]+,rank[v[j+]]);
s[]=s[a]=-;q[]=;t=;
for (int j=;j<a;j++)
{
while (t&&s[q[t]]>s[j])t--;
ls[j]=q[t],q[++t]=j;
}
t=,q[]=a;
for (int j=a-;j>;j--)
{
while (t&&s[q[t]]>=s[j])t--;
rs[j]=q[t],q[++t]=j;
}
ans=;
for (int j=;j<a;j++)ans=(ans+(ll)(j-ls[j])*(rs[j]-j)*s[j])%M;
printf("%lld\n",ans);
for (int j=;j<=a;j++)vis[v[j]]=;
}
}
bzoj3879的更多相关文章
- 【BZOJ3879】SvT(后缀自动机,虚树)
[BZOJ3879]SvT(后缀自动机,虚树) 题面 BZOJ 题解 看着这个东西,询问若干个前缀两两之间的\(lcp\)? 显然\(lcp\)就是\(SAM\)构建出来的\(parent\)数上的\ ...
- 【BZOJ3879】SvT 后缀数组+单调栈
[BZOJ3879]SvT Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干 ...
- [bzoj3879]SvT_后缀数组_RMQ_单调栈
SvT bzoj-3879 题目大意:给定一个字符串.每次询问给定$t$个位置,求两两位置开头的后缀的$LCP$之和. 注释:$1\le length\le 5\cdot 10^5$,$\sum t\ ...
- AHOI2013 差异 和 BZOJ3879 SvT
差异 题目描述 给定一个长度为 $n$ 的字符串 $S$,令 $T_i$ 表示它从第 $i$ 个字符开始的后缀.求 $\displaystyle \sum_{1\leqslant i<j\leq ...
- bzoj3879 SvT(后缀自动机+虚树)
bzoj3879 SvT(后缀自动机+虚树) bzoj 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始位置 ...
- BZOJ3879: SvT
后缀数组裸题,每次的查询单调栈扫一遍就完了.为什么要写虚后缀树= =后缀数组不是自带虚树的结构么= = #include<cstdio> #include<algorithm> ...
- bzoj千题计划313:bzoj3879: SvT(后缀数组+st表+单调栈)
https://www.lydsy.com/JudgeOnline/problem.php?id=3879 把所有的后缀取出,按rank排序 求出相邻两个后缀的lcp 每个后缀对答案的贡献就是 与在它 ...
- BZOJ3879:SvT(后缀数组,单调栈,ST表)
Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...
- BZOJ3879: SvT【后缀数组+单调栈】
Description (我并不想告诉你题目名字是什么鬼) 有一个长度为n的仅包含小写字母的字符串S,下标范围为[1,n]. 现在有若干组询问,对于每一个询问,我们给出若干个后缀(以其在S中出现的起始 ...
随机推荐
- TEA加密/解密算法
在游戏项目中,一般需要对资源或数据进行加密保护,最简单高效的加密算法就是采用位与或之类的,但是比较容易被人分析出来.TEA加密算法不但比较简单,而且有很强的抗差分分析能力,加密速度也比较快.可以根据项 ...
- Codeforces 984 D - XOR-pyramid
D - XOR-pyramid 思路: 区间dp dp[l][r]表示ƒ([l, r])的值 显然,状态转移方程为dp[l][r] = dp[l][r-1] ^ dp[l+1][r] 初始状态dp[i ...
- MySQL命令行的备份与还原
备份的语法; mysqldump -uroot -p shop> 数据库路径 还原的语法: mysql -uroot -p 具体数据库(shop0609)< 数据库路径
- python 读写TXT,安装pandas模块。
今天需要用python读TXT 文件,发现pandas库好用,所以就去下载,没想pythoncharm中的setting中下载失败,所以去下源文件,安装pandas 是提示得先装numpy库,于是又去 ...
- Bipartite Segments CodeForces - 901C (区间二分图计数)
大意: 给定无向图, 无偶环, 每次询问求[l,r]区间内, 有多少子区间是二分图. 无偶环等价于奇环仙人掌森林, 可以直接tarjan求出所有环, 然后就可以预处理出每个点为右端点时的答案. 这样的 ...
- python记录_day09 初识函数
一.认识函数 函数:对动作或者功能的封装 格式: 函数声明 def 函数名(): 函数体 函数调用 函数名() #定义函数 def xiao(): print("你的笑像一 ...
- 廖雪峰网站:学习python函数—递归函数(四)
# 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数 # 计算阶乘n! = 1 x 2 x 3 x ... x n,用函数fact(n)表示,可以看出: # fact ...
- Python之深浅copy与字符编码
一.深浅copy 1. 首先看赋值运算 l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barr ...
- zzw原创_LIKE与regexp_like中的_及转义符
1.select table_name from user_tables where table_name like 'MENU%';查出以下表MENUMENUGGG_131MENU_132MENU ...
- 四、持久层框架(Hibernate)
一.一级缓存与二级缓存 1.一级缓存:Hibernate默认是开启一级缓存的,一级缓存存放在session里,一个Session做一次查询操作,会把这个操作的结果放在一级缓存中,如果短时间内这个ses ...