广义SAM求助
查看原帖
广义SAM求助
520056
luoyx楼主2023/8/14 14:25
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+6;
char s[N];
struct SAM{
	int fa,len,ch[26],siz[2];
}sam[N];
struct TRIE{
	int ch[26],fa,pos,siz[2],c;
}tr[N];
int cnt,tot=1;
void insert_trie(char s[],int id){
	int p=0;
	int len=strlen(s);
	for(int i=0;i<len;i++){
		int a=s[i]-'a';
		if(!tr[p].ch[a]) tr[p].ch[a]=++cnt;
		p=tr[p].ch[a];
		tr[p].siz[id]++;
		tr[p].c=a;
	}
}
int insert_sam(int lst,int c,int siz[]){
	int p=lst,np=++tot;
	sam[np].len=sam[p].len+1;
	for(;p&&!sam[p].ch[c];p=sam[p].fa) sam[p].ch[c]=np;
	if(!p) sam[np].fa=1;
	else{
		int q=sam[p].ch[c];
		if(sam[q].len-1==sam[p].len){
			sam[np].fa=q;
		}
		else{
			int nq=++tot;
			sam[nq]=sam[q];
			sam[nq].len=sam[p].len+1;
			for(;p&&sam[p].ch[c]==q;p=sam[p].fa) sam[p].ch[c]=nq;
			sam[np].fa=sam[q].fa=nq;
		}
	}
	sam[np].siz[0]=siz[0];
	sam[np].siz[1]=siz[1];
	return np;
}
void bfs(){
	queue<int> q;
	tr[0].pos=1;
	for(int i=0;i<26;i++){
		if(tr[0].ch[i]) q.push(tr[0].ch[i]);
	}
	while(!q.empty()){
		int u=q.front();
		q.pop();
		tr[u].pos=insert_sam(tr[tr[u].fa].pos,tr[u].c,tr[u].siz);
		for(int i=0;i<26;i++){
			if(tr[u].ch[i]) q.push(tr[u].ch[i]);
		}
	}
}
int head[N],ecnt;
struct edge{
	int v,nxt;
}e[N];
void add(int u,int v){
	e[++ecnt].v=v;
	e[ecnt].nxt=head[u];
	head[u]=ecnt++;
}
int ans=1e9;
void dfs(int u){
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].v;dfs(v);
		sam[u].siz[0]+=sam[v].siz[0];
		sam[u].siz[1]+=sam[v].siz[1];
	}
	if(sam[u].siz[0]==1&&sam[u].siz[1]==1){
		ans=min(ans,sam[sam[u].fa].len+1);
	}
}
int main(){
	cin>>s;
	insert_trie(s,0);
	cin>>s;
	insert_trie(s,1);
	bfs();
	for(int i=2;i<=tot;i++) add(sam[i].fa,i);
	dfs(1);
	cout<<ans;
}
2023/8/14 14:25
加载中...