bzoj 4566: [Haoi2016]找相同字符【SAM上DP

#include#define MAXN 400057using namespace std; char read_s[MAXN];struct t1{ int son[MAXN][26],pre[MAXN],dis[MAXN]; int siz[MAXN]; int lst,cnt; int lth; int p,np,q,nq; void insert(int x){
摘要由CSDN通过智能技术生成

i号节点表示的不同串的个数是dis[pre[i]]-dis[i],而这个串出现的次数就是当前节点的right集合大小

于是就有奇怪的转移方程了

然后胡搞乱搞一切水到渠成【玄学吗x

#include<bits/stdc++.h>
#define MAXN 400057
using namespace std;	char read_s[MAXN];

struct t1{
	int son[MAXN][26],pre[MAXN],dis[MAXN];
	int siz[MAXN];
	int lst,cnt;
	int lth;
	int p,np,q,nq;
	
	void insert(int x){
		dis[np=++cnt]=dis[p=lst]+1;
		lst=np;
		siz[np]=1;
		for(;p&&!son[p][x];p=pre[p])	son[p][x]=np;
		if(!p)	return pre[np]=1,void();
		q=son[p][x];
		if(dis[p]+1==dis[q])	pre[np]=q;
		else{
			dis[nq=++cnt]=dis[p]+1;
			memcpy(son[nq],son[q],sizeof son[q]);
			pre[nq]=pre[q];
			pre[np]=pre[q]=nq;
			for(;p&&son[p][x]==q;p=pre[p])	son[p][x]=nq;
		}
	}
	
	void build(){
		lst=cnt=1;
		scanf("%s",read_s);
		lth=strlen(read_s);
		for(int i=0;i<lth;+&#
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值