玄学求助
查看原帖
玄学求助
36933
zhy12138楼主2021/6/3 17:13
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<vector>
#define ll long long
using namespace std;
const int MAXN=2e5+10;
int read()
{
	int kkk=0,x=1;
	char c=getchar();
	while((c<'0' || c>'9') && c!='-') c=getchar();
	if(c=='-') c=getchar(),x=-1;
	while(c>='0' && c<='9') kkk=kkk*10+(c-'0'),c=getchar();
	return kkk*x;
}
int cnt=1,last=1,n,ans[MAXN*2],ANS,maxn[MAXN*2];
struct SAM
{
	int len,ch[26],fa;
}sam[MAXN*2];
void sam_in(int c)
{
	int p=last,np=last=++cnt;
	sam[np].len=sam[p].len+1;
	while(p && !sam[p].ch[c])
	{
		sam[p].ch[c]=np;
		p=sam[p].fa;
	}
	if(!p) sam[np].fa=1;
	else
	{
		int q=sam[p].ch[c];
		if(sam[q].len==sam[p].len+1) sam[np].fa=q;
		else
		{
			int nq=++cnt;
			sam[nq]=sam[q];
			sam[nq].len=sam[p].len+1;
			sam[np].fa=sam[q].fa=nq;
			while(p && sam[p].ch[c]==q)
			{
				sam[p].ch[c]=nq;
				p=sam[p].fa;
			}
		}
	}
}
struct node
{
	int head[MAXN*2],tot;
	int to[MAXN*2],nextn[MAXN*2];
	void ADD(int u,int v)
	{
		to[++tot]=v,nextn[tot]=head[u];
		head[u]=tot;
	}
}Ed;
void Pick(int u)
{
	for(int i=Ed.head[u];i!=0;i=Ed.nextn[i])
	{
		int v=Ed.to[i];
		Pick(v);
		maxn[u]=max(maxn[u],min(sam[u].len,maxn[v]));
	}
	ans[u]=min(ans[u],maxn[u]);
}
//char s[15][MAXN];
char s[MAXN];
int main()
{
	//while(~scanf("%s",s[++n])) ;
	scanf("%s",s);
	//int Len=strlen(s[1]);
	int Len=strlen(s);
	//for(int i=0;i<Len;++i) sam_in(s[1][i]-'a');
	for(int i=0;i<Len;++i) sam_in(s[i]-'a');
	for(int i=2;i<=cnt;++i) Ed.ADD(sam[i].fa,i);
	for(int i=1;i<=cnt;++i) ans[i]=sam[i].len;
	while(~scanf("%s",s))
	//for(int p=2;p<=n;++p)
	{
		memset(maxn,0,sizeof(maxn));
		//Len=strlen(s[p]);
		Len=strlen(s);
		for(int i=0,len=0,x=1;i<Len;++i)
		{
			//int c=s[p][i]-'a';
			int c=s[i]-'a';
			while(x!=1 && !sam[x].ch[c]) {x=sam[x].fa;len=sam[x].len;}
			if(sam[x].ch[c]) x=sam[x].ch[c],++len;
			maxn[x]=max(maxn[x],len);
		}
		Pick(1);
	}
	for(int i=1;i<=cnt;++i) ANS=max(ANS,ans[i]);
	printf("%d\n",ANS);
	return 0;
}
//ore no turn,draw!
2021/6/3 17:13
加载中...