首页 > 其他分享 >SAM代补题

SAM代补题

时间:2022-08-31 23:01:18浏览次数:38  
标签:rr SAM int LL mid 补题 ll

Hacker

对模式串建立 SAM ,将匹配串的字符一个个走下去,没有该字符就向上跳 parent tree 上的父亲继续找,如此得到对于每个前缀 b1,i 的可最长匹配的后缀,加个线段树维护权值前缀和的最小值即可。

#include<bits/stdc++.h>
#define IL inline
#define LL long long
using namespace std;
const int N=2e5+3;
const LL inf=1e18;
struct node{
	int ch[26],fa,len;
};
int n,m,k,ml,pos;
LL val[N],ans;
char s[N];
struct segment{
	LL Min[N<<2];
	#define ls k<<1
	#define rs k<<1|1
	IL void pushup(int k){Min[k]=min(Min[ls],Min[rs]);}
	void build(int k,int l,int r){
		if(l==r){Min[k]=val[l];return;}
		int mid=l+r>>1;
		build(ls,l,mid),build(rs,mid+1,r);
		pushup(k);
	}
	LL query(int k,int l,int r,int ll,int rr){
		if(l>=ll&&r<=rr) return Min[k];
		int mid=l+r>>1;
		if(ll>mid) return query(rs,mid+1,r,ll,rr);
		if(rr<=mid) return query(ls,l,mid,ll,rr);
		return min(query(ls,l,mid,ll,rr),query(rs,mid+1,r,ll,rr));
	}
}T;
struct SAM{
	node a[N];int las=1,cnt=1;
	IL void ins(int pos,int c){
		int p=las,np;a[np=las=++cnt].len=pos;
		while(p&&!a[p].ch[c]) a[p].ch[c]=np,p=a[p].fa;
		if(!p){a[np].fa=1;return;}
		int q=a[p].ch[c];
		if(a[q].len==a[p].len+1){a[np].fa=q;return;}
		int nq=++cnt;a[nq]=a[q],a[nq].len=a[p].len+1;
		a[np].fa=a[q].fa=nq;
		while(p&&a[p].ch[c]==q) a[p].ch[c]=nq,p=a[p].fa;
	}
	void go(int wei,int c){
		while(pos^1&&!a[pos].ch[c]) pos=a[pos].fa,ml=a[pos].len;
		if(a[pos].ch[c]) pos=a[pos].ch[c],++ml;
		ans=max(ans,val[wei]-T.query(1,0,m,wei-ml,wei));
	}
}S;
IL int in(){
	char c;int f=1;
	while((c=getchar())<'0'||c>'9')
	  if(c=='-') f=-1;
	int x=c-'0';
	while((c=getchar())>='0'&&c<='9')
	  x=x*10+c-'0';
	return x*f;
}
int main()
{
	n=in(),m=in(),k=in();
	scanf("%s",s+1);
	for(int i=1;i<=n;++i) S.ins(i,s[i]-'a');
	for(int i=1;i<=m;++i) val[i]=val[i-1]+in();
	T.build(1,0,m);
	while(k--){
		scanf("%s",s+1),pos=1,ml=0,ans=0;
		for(int i=1;i<=m;++i) S.go(i,s[i]-'a');
		printf("%lld\n",ans);
	}
	return 0;
}

标签:rr,SAM,int,LL,mid,补题,ll
From: https://www.cnblogs.com/liang302/p/16644847.html

相关文章

  • (部分)多校补题集
    目录hdu104Ball(bitset)hdu107Treasure(重构树+树状数组)hdu807Darnassus(根号乱搞+最小生成树)hdu104Ball(bitset)把所有边升序排序后,枚举中间大小的边\(e\)考虑对每个......
  • LeetCode 1779. Find Nearest Point That Has the Same X or Y Coordinate
    原题链接在这里:https://leetcode.com/problems/find-nearest-point-that-has-the-same-x-or-y-coordinate/题目:Youaregiventwointegers, x and y,whichrepresen......
  • 错误: 找不到或无法加载主类 com.itextpdf.samples.sandbox.tables.SimpleTable
    网上有一堆方法,但都没有解决我的问题。解决方法:将下面的勾去掉,保存即可。 这些代码都在test下面,所以这个如果排除的话,是不会执行成功的。  ......
  • Educational Codeforces Round 134 E - Prefix Function Queries补题
    原题链接参考了jly的写法#pragmaGCCoptimize(2)#include<bits/stdc++.h>usingnamespacestd;#definefrfirst#definesesecond#defineet0exit(0);#define......
  • 51nod 省选3 4补题
    3B考虑分手是祝愿的推法。再者,为什么能把每一维的行走都看成步,然后只要计算总步数的答案?某一维到边界后就不会在走了。可能是某些维交替进行的撤销操作不一定......
  • 2019ICPC南京[补题]
    1.0C1.1题目大意:  给我们一张网格图,我们求出所有的路径使得这个路径至少包括四个点,且这四个点是严格递增且相邻两个点的差值为\(1\),......
  • MongDB aggregation _ sample
    [{$match:{createdTime:{$gt:ISODate('2022-08-23T00:00:00.000Z')}}},{$match:{invalidType:{$ne:'InvalidUser'}}},{$match:......
  • Mysql 存储引擎(Innodb & MyIsam)
    SHOWENGINES;#查看mysql上面全部的存储引擎  下面主要讲解Innodb&MyIsam1.数据结构a.Innodb数据,索引,表结构都存在一个.ibd文件里b.MyIsam在磁盘上存储分......
  • EFCore Map 2 entities to same table
    EFCoreMap2entitiestosametable问题I'mtryingtouseDDDwithEFCoreandIamstrugglingtofindawaytomap2POCOsfromdifferentcontextthatrepres......
  • HDU多校补题
    数论5-02PN筛题目链接7-09min-25插值多项式7-10EGF题目链接对于有标号的计数问题,考虑EGF,且有已知结论:设无向图的EGF为G,无向连通图的EGF为F,有G=exp(F)。考虑边......