求助SAM题,不知道还算不算萌新就不btd了
查看原帖
求助SAM题,不知道还算不算萌新就不btd了
190926
Diwanul楼主2021/8/21 22:58

RT,WA了只有55分,没找到和我一样的。记录

仿照第一篇题解写的。求调。

#include<bits/stdc++.h>

//#define RELEASE
#ifndef RELEASE
	//#define FL
	#define DB puts("debug")
#endif 

using namespace std;

typedef long long ll;
const int S=1000003,NN=S*2;

inline int read(){
	char c=getchar();
	int res=0;
	bool b=0;
	while(c>'9'||c<'0')b=(c=='-'),c=getchar();
	while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
	return b?-res:res;
}

int n;
ll ans;
char s[S+10];
int ch[NN+10][26],ln[NN+10],lnk[NN+10],siz[NN+10],tn=1,lst=1;
int tmp[NN+10];

void Ins(int c){
	int p=lst,u=lst=++tn;
	ln[u]=ln[p]+1;
	siz[u]=1;
	while(p&&!ch[p][c])
		ch[p][c]=u,p=lnk[p];
	if(!p)
		return lnk[u]=1,void();
	int q=ch[p][c];
	if(ln[q]==ln[p]+1)
		return lnk[u]=q,void();
	int cln=++tn;
	lnk[cln]=lnk[q],lnk[q]=lnk[u]=cln;
	ln[cln]=ln[p]+1;
	for(register int i=0;i<26;i++)
		ch[cln][i]=ch[q][i];
	while(p&&ch[p][c]==q)
		ch[p][c]=cln;
}

bool Cmp(int a,int b){
	return ln[a]>ln[b];
}

void Calc(){
	for(register int i=1;i<=tn;++i)
		tmp[i]=i;
	sort(tmp+1,tmp+1+tn,Cmp);
	for(register int i=1;i<=tn;++i){
		int t=tmp[i];
		siz[lnk[t]]+=siz[t];
		ans+=(ll)(ln[t]-ln[lnk[t]])*siz[t]*(n-siz[t]);
	}
}

int main(){
	#ifdef fl
		freopen(".in","r",stdin);
		#ifndef db
			freopen(".out","w",stdout);
		#endif
	#endif
	scanf("%s",s+1);
	n=strlen(s+1);
	for(register int i=1;i<=n;++i)
		Ins(s[i]-'a');
	Calc();
	printf("%lld\n",ans);
	#ifdef db
		system("pause");
	#endif
	return 0;
}
/*
 * \________     \______  \__      \__      \__  \___      \__  \__       \__  \__
 * \__     \__     \__    \__     \____     \__  \____     \__  \__       \__  \__
 * \__      \__    \__     \__   \__ \__   \__   \__\__    \__  \__       \__  \__
 * \__      \__    \__     \__   \__ \__   \__   \__ \__   \__  \__       \__  \__
 * \__      \__    \__     \__   \__ \__   \__   \__  \__  \__  \__       \__  \__
 * \__      \__    \__      \__ \__   \__ \__    \__   \__ \__  \__       \__  \__
 * \__      \__    \__      \__ \__   \__ \__    \__    \__\__  \__       \__  \__
 * \__     \__     \__       \____     \____     \__     \____   \__     \__   \__
 * \________     \______      \__       \__      \__      \___     \______     \__________
 *
 * \___________      \_____     \__
 *      \__        \___  \___   \__
 *      \__       \___     \__  \__
 *      \__      \__            \__
 *      \__      \__            \__
 *      \__      \__            \__
 *      \__       \___     \__  \__
 *      \__        \___  \___   \__
 *      \__          \_____     \__________
*/
2021/8/21 22:58
加载中...