SAM

struct state {

	int len,link;
	int nxt[31];

};

char s[N];
int n,ans,t[N],a[N],b[N],O;
struct SAM {

	state st[N*2];
	int siz,last;

	void init() {
		for(int i=0; i<=O; i++) {
			st[i].len=0;
			st[i].link=0;
			for(int j=0; j<31; j++) {
				st[i].nxt[j]=-1;
			}
		}
		siz=1;
		last=1;
	}

	void extend(int c) {

		int cur=++siz,p=last;
		st[cur].len=st[last].len+1;
		b[cur]=1;
		while(p!=0&&st[p].nxt[c]<0) {
			st[p].nxt[c]=cur;
			p=st[p].link;
		}
		if(p==0) st[cur].link=1;
		else {

			int q=st[p].nxt[c];
			if(st[p].len+1==st[q].len) {
				st[cur].link=q;
			} else {

				int k=++siz;
				st[k].len=st[p].len+1;
				memcpy(st[k].nxt,st[q].nxt,sizeof st[k].nxt);
				st[k].link=st[q].link;
				while(p!=0&&st[p].nxt[c]==q) {
					st[p].nxt[c]=k;
					p=st[p].link;
				}
				st[q].link=st[cur].link=k;

			}

		}
		last=cur;

	}

} Sam;

int sum[N],k,T;
void solve() {

	ans=n+1;
	for(int i=1; i<=Sam.siz; i++) t[Sam.st[i].len]++;
	for(int i=1; i<=Sam.siz; i++) t[i]+=t[i-1];
	for(int i=1; i<=Sam.siz; i++) a[t[Sam.st[i].len]--]=i;
	for(int i=Sam.siz; i; i--) {

		int x=a[i];
		b[Sam.st[x].link]+=b[x];
	}
	
}
posted @   Diamondan  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
点击右上角即可分享
微信分享提示