题意:给串s和t,对于串s每个位置有一个价值f,两种操作1.修改f[a]=b,2.查询串t子串Ta-b在s的子串Sc-d中出现位置的f和

题解:s和t建sam,把fail树按dfs序建bit套线段树,就变成了单点修改,子树(区间)查询区间个数

//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
//#pragma GCC optimize(4)
//#pragma GCC optimize("unroll-loops")
//#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#include<bits/stdc++.h>
#define fi first
#define se second
#define db double
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define ld long double
//#define C 0.5772156649
//#define ls l,m,rt<<1
//#define rs m+1,r,rt<<1|1
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define ull unsigned long long
//#define base 1000000000000000000
#define fin freopen("a.txt","r",stdin)
#define fout freopen("a.txt","w",stdout)
#define fio ios::sync_with_stdio(false);cin.tie(0)
inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
inline void sub(ll &a,ll b){a-=b;if(a<0)a+=mod;}
inline void add(ll &a,ll b){a+=b;if(a>=mod)a-=mod;}
template<typename T>inline T const& MAX(T const &a,T const &b){return a>b?a:b;}
template<typename T>inline T const& MIN(T const &a,T const &b){return a<b?a:b;}
inline ll qp(ll a,ll b){ll ans=1;while(b){if(b&1)ans=ans*a%mod;a=a*a%mod,b>>=1;}return ans;}
inline ll qp(ll a,ll b,ll c){ll ans=1;while(b){if(b&1)ans=ans*a%c;a=a*a%c,b>>=1;}return ans;} using namespace std; const ull ba=233;
const db eps=1e-5;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int N=200000+10,maxn=1000000+10,inf=0x3f3f3f3f; int NX,n;
struct bit_seg{
int root[N<<1],ls[N*100],rs[N*100],sum[N*100],res;
void init()
{
for(int i=0;i<=NX;i++)root[i]=0;
for(int i=0;i<=res;i++)ls[i]=rs[i]=sum[i]=0;
res=0;
}
void update(int &o,int pos,int v,int l,int r)
{
if(!o)o=++res;
sum[o]+=v;
if(l==r)return ;
int m=(l+r)>>1;
if(pos<=m)update(ls[o],pos,v,l,m);
else update(rs[o],pos,v,m+1,r);
}
int query(int L,int R,int o,int l,int r)
{
if(!o||l>r||L>R)return 0;
if(L<=l&&r<=R)return sum[o];
int m=(l+r)>>1,ans=0;
if(L<=m)ans+=query(L,R,ls[o],l,m);
if(m<R)ans+=query(L,R,rs[o],m+1,r);
return ans;
}
int bitquery(int L,int R,int a,int b)
{
int ans=0;
for(int i=R;i;i-=i&(-i))ans+=query(a,b,root[i],0,n-1);
for(int i=L-1;i;i-=i&(-i))ans-=query(a,b,root[i],0,n-1);
return ans;
}
void bitupdate(int i,int pos,int v)
{
for(;i<=NX;i+=i&(-i))update(root[i],pos,v,0,n-1);
}
}bs;
char s[N],p[N];
int pos[N][2];
int g[N];
struct SAM{
int last,cnt;
int ch[N<<1][26],fa[N<<1],l[N<<1];
int f[N<<1][20],L[N<<1],R[N<<1],res;
struct edge{int to,Next;}e[N<<1];
int head[N<<1],cnt1;
void add(int u,int v){e[cnt1].to=v,e[cnt1].Next=head[u];head[u]=cnt1++;}
void init(){
for(int i=1;i<=cnt;i++)
{
memset(ch[i],0,sizeof ch[i]);
l[i]=fa[i]=L[i]=R[i]=0;
}
memset(head,-1,sizeof head);
cnt=1;
res=cnt1=0;
}
void ins(int c){
if(ch[last][c])
{
int p=last,q=ch[last][c];
if(l[q]==l[p]+1)last=q;
else
{
int nq=++cnt;l[nq]=l[p]+1;
memcpy(ch[nq],ch[q],sizeof ch[q]);
fa[nq]=fa[q];fa[q]=last=nq;
for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
return ;
}
int p=last,np=++cnt;last=np;l[np]=l[p]+1;
for(;p&&!ch[p][c];p=fa[p])ch[p][c]=np;
if(!p)fa[np]=1;
else
{
int q=ch[p][c];
if(l[p]+1==l[q])fa[np]=q;
else
{
int nq=++cnt;l[nq]=l[p]+1;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];fa[q]=fa[np]=nq;
for(;ch[p][c]==q;p=fa[p])ch[p][c]=nq;
}
}
}
int go(int x,int y)
{
x=pos[x][1];
for(int i=19;~i;--i)if(l[f[x][i]]>=y)x=f[x][i];
return x;
}
void dfs(int u)
{
L[u]=++res;
for(int i=head[u];~i;i=e[i].Next)dfs(e[i].to);
R[u]=res;
}
void gao()
{
last=1;
int lens=strlen(s),lenp=strlen(p);
for(int i=0;i<lens;i++)ins(s[i]-'a'),pos[i][0]=last;
last=1;
for(int i=0;i<lenp;i++)ins(p[i]-'a'),pos[i][1]=last;
NX=cnt;n=lens;
for(int i=1;i<=cnt;i++)
{
f[i][0]=fa[i];
if(fa[i])add(fa[i],i);
}
dfs(1);
for(int i=0;i<lens;i++)scanf("%d",&g[i]), bs.bitupdate(L[pos[i][0]],i,g[i]);
for(int i=1;i<=19;i++)
for(int j=1;j<=cnt;j++)
f[j][i]=f[f[j][i-1]][i-1];
}
}sam;
int main()
{
int T;scanf("%d",&T);
while(T--)
{
sam.init();
bs.init();
scanf("%s%s",s,p);
sam.gao();
int q,ans=0;scanf("%d",&q);
while(q--)
{
int op,a,b,c,d;scanf("%d%d%d",&op,&a,&b);
a^=ans,b^=ans;
if(op==1)
{
bs.bitupdate(sam.L[pos[a][0]],a,b-g[a]);
g[a]=b;
}
else
{
scanf("%d%d",&c,&d);c^=ans,d^=ans;
c+=b-a;
if(c>d)
{
printf("%d\n",ans=0);
continue;
}
int x=sam.go(b,b-a+1);
printf("%d\n",ans=bs.bitquery(sam.L[x],sam.R[x],c,d));
}
}
}
return 0;
}
/********************
1
abab
baba
6 1 2 3
3
2 0 1 0 3
1 6 6
2 6 6 6 4
********************/

HDU - 6054String and String的更多相关文章

  1. HDU 4054 Number String

    HDU 4054 Number String 思路: 状态:dp[i][j]表示以j结尾i的排列 状态转移: 如果s[i - 1]是' I ',那么dp[i][j] = dp[i-1][j-1] + ...

  2. hdu 5311 Hidden String

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Description Today is the 1st anniv ...

  3. hdu 5311 Hidden String (BestCoder 1st Anniversary ($))(深搜)

    http://acm.hdu.edu.cn/showproblem.php?pid=5311 Hidden String Time Limit: 2000/1000 MS (Java/Others)  ...

  4. HDU 5311 Hidden String (暴力)

    题意:今天是BestCoder一周年纪念日. 比赛管理员Soda有一个长度为n的字符串s. 他想要知道能否找到s的三个互不相交的子串s[l1..r1], s[l2..r2], s[l3..r3]满足下 ...

  5. HDU 4668 Finding string (解析字符串 + KMP)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一个压缩后的串,以及一个模式串,问模式串 ...

  6. HDU 5694 BD String 迭代

    BD String 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5694 Description Problem Description 众所周知, ...

  7. HDU 4055 Number String dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4055 Number String Time Limit: 10000/5000 MS (Java/O ...

  8. hdu 4055 Number String

    Number String http://acm.hdu.edu.cn/showproblem.php?pid=4055 Time Limit: 10000/5000 MS (Java/Others) ...

  9. HDU 5707 Combine String(动态规划)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5707 题意: 给你三个字符串 S1, S2, S3, 让你判断 S3 是否恰好由字符串 S1 和 S2 ...

随机推荐

  1. [BZ4923][Lydsy1706月赛]K小值查询

    K小值查询 题面 维护一个长度为n的正整数序列a_1,a_2,...,a_n,支持以下两种操作: 1 k,将序列a从小到大排序,输出a_k的值. 2 k,将所有严格大于k的数a_i减去k. Input ...

  2. luogu P1578 奶牛浴场

    很好的一道题 王知昆爷爷的论文(讲的特别清楚) https://wenku.baidu.com/view/bc8311f69e314332396893f7.html 先贴上AC代码 #include& ...

  3. window xshell 连接本地ubuntu虚拟机

    先设置VMware 虚拟机的连接属性 1.桥接,利用真实网卡  设置和window 同一个网段就可以直接通信 2.hostnoly是通过vm8(查看你的所有网络连接) 只能和主机联系 设置和vm8同一 ...

  4. Dynamics CRM On-Premise V9安装手记

    下载地址: https://download.microsoft.com/download/A/D/D/ADDD6898-4EFA-46FA-80B6-6FE9A3CDED63/CRM9.0-Serv ...

  5. JS动态添加行列

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Add-Delete Row.a ...

  6. bloc控制读写文件

    import 'package:flutter/material.dart'; import 'dart:io'; import 'package:path_provider/path_provide ...

  7. Linux 内存泄漏检查工具 valgrind

    抄自<从零开始的JSON库教程>,先mark一下,以后再慢慢研究. ======== 引用分割线 ======== 在 Linux.OS X 下,我们可以使用 valgrind 工具(用 ...

  8. Bugku-CTF之速度要快

    Day21 速度要快 速度要快!!!!!! http://123.206.87.240:8002/web6/

  9. 王之泰《面向对象程序设计(java)》课程学习总结

    第一部分:理论知识学习部分 总复习纲要 1. Java语言特点与开发环境配置(第1章.第2章) 2. Java基本程序结构(第3章) 3. Java面向对象程序结构(第4章.第5章.第6章) 4. 类 ...

  10. flutter Dynamic updates 热更新 版本更新

    比较新的解释 https://juejin.im/entry/5c85c959f265da2d881b5eb8 https://my.oschina.net/u/1464083/blog/297880 ...