QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#80421#4057. 子串统计LYC_music25 424ms237416kbC++143.7kb2023-02-23 17:07:502023-02-23 17:07:51

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-23 17:07:51]
  • 评测
  • 测评结果:25
  • 用时:424ms
  • 内存:237416kb
  • [2023-02-23 17:07:50]
  • 提交

answer

#include<bits/stdc++.h>
#define poly vector<int>
#define IOS ios::sync_with_stdio(false)
#define ll long long
#define mp make_pair
#define mt make_tuple
#define pa pair < int,int >
#define fi first
#define se second
#define inf 1e9
#define mod 998244353
// #define int ll
#define N 500005
using namespace std;
ll fac[N],inv[N];
int Z[N];
string st;
int n;
ll ans;
int ss[N];
ll DP[5005][5005];
int lcp[5005][5005];
inline ll quickPower(ll x,int y)
{
	ll res=1;
	while (y)
	{
		if (y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
inline ll C(ll x,ll y)
{
	if (x<y||y<0) return 0;
	return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
namespace SAM
{
	int tr[N][27];
	int L[N];
	int pre[N];
	int isc[N];
	int lst=0;
	int siz[N];
	int cnt=0;
	poly G[N];
	int ffa[N][21];
	void insert(int v)
	{
		int now=++cnt;
		// cout<<"ins "<<v<<" "<<lst<<" "<<now<<'\n';
		siz[now]=1;
		L[now]=L[lst]+1;
		Z[L[now]]=now;
		while (1)
		{
			if (!tr[lst][v])
			{
				tr[lst][v]=now;
				if (lst==0) 
				{
					break;
				}
			} else
			{
				int p=tr[lst][v];
				if (L[p]==L[lst]+1)
				{
					pre[now]=p;
					break;
				}
				int np=++cnt;
				pre[np]=pre[p];
				for (int i=0;i<26;i++) tr[np][i]=tr[p][i];
				L[np]=L[lst]+1;
				pre[p]=np;
				while (tr[lst][v]==p)
				{
					tr[lst][v]=np;
					if (lst==0) break;
					lst=pre[lst];
				}
				pre[now]=np;
				break;
			}
			lst=pre[lst];
		}
		lst=now;
	}
	void dfs(int k)
	{
		for (auto u:G[k])
		{
			dfs(u);
			siz[k]+=siz[u];
		}
	}
	void calc()
	{
		for (int i=0;i<=cnt;i++) 
		{
			if (i)
				G[pre[i]].push_back(i);
		}
		dfs(0);
	}
	void work()
	{
		for (int i=1;i<=cnt;i++)
			ffa[i][0]=pre[i];
		for (int i=1;i<=18;i++)
			for (int j=1;j<=cnt;j++)
				ffa[j][i]=ffa[ffa[j][i-1]][i-1];
	}
}
using namespace SAM;
int query(int l,int r)
{
	int now=Z[r];
	for (int i=18;i>=0;i--)
		if (L[ffa[now][i]]>=r-l+1)
		{
			now=ffa[now][i];
		}
	return siz[now];
}	
void BellaKira()
{
	fac[0]=1;
	for (int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod;
	inv[N-1]=quickPower(fac[N-1],mod-2);
	for (int i=N-1;i>=1;i--) inv[i-1]=inv[i]*i%mod;
	cin>>st;
	n=st.size();
	if (n>5000)
	{
		for (auto u:st) SAM::insert(u-'a');
		SAM::calc();
		SAM::work();
		queue<pa>q;
		map<pa,ll>dp,vis;
		for (int i=1;i<=n;i++) q.push(mp(i,i)),dp[mp(i,i)]=vis[mp(i,i)]=1;
		while (!q.empty())
		{
			pa now=q.front();
			q.pop();
			int v=query(now.fi,now.se);
			if (v==1)
			{
				ans=(ans+dp[now]*C(now.fi-1+n-now.se,now.fi-1)%mod)%mod;
				continue;
			} else
			{
				dp[now]=dp[now]*v%mod;
			}
			
			if (now.fi-1>=1) 
			{
				dp[mp(now.fi-1,now.se)]=(dp[mp(now.fi-1,now.se)]+dp[now])%mod;
				if (!vis[mp(now.fi-1,now.se)])
					q.push(mp(now.fi-1,now.se)),vis[mp(now.fi-1,now.se)]=1;
			}
			if (now.se+1<=n) 
			{
				dp[mp(now.fi,now.se+1)]=(dp[mp(now.fi,now.se+1)]+dp[now])%mod;
				if (!vis[mp(now.fi,now.se+1)])
					q.push(mp(now.fi,now.se+1)),vis[mp(now.fi,now.se+1)]=1;
			}
		}
		cout<<ans<<'\n';
	} else
	{
		for (int i=n;i>=1;i--)	
			for (int j=n;j>=1;j--)
				if (st[i-1]==st[j-1])
					lcp[i][j]=(lcp[i+1][j+1]+1);
		for (int i=1;i<=n;i++)
		{
			for (int j=0;j<=n;j++) ss[j]=0;
			for (int j=1;j<=n;j++)
				ss[lcp[i][j]]++;
				for (int j=n;j>=0;j--)
				ss[j]+=ss[j+1];
			for (int j=i;j<=n;j++)
				lcp[i][j]=ss[j-i+1];	
		}
		queue<pa>q;
		for (int i=1;i<=n;i++)
			DP[i][i]=lcp[i][i];
		for (int len=2;len<=n;len++)
			for (int i=1;i+len-1<=n;i++)
			{
				int j=i+len-1;
				DP[i][j]=(DP[i+1][j]+DP[i][j-1])*lcp[i][j]%mod;
			}
		cout<<DP[1][n]<<'\n';
	}
		
		
}
signed main()
{
	IOS;
	cin.tie(0);
	int T=1;
	while (T--)
	{
		BellaKira();
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 5
Accepted
time: 368ms
memory: 237364kb

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

842068617

result:

ok 1 number(s): "842068617"

Test #2:

score: 5
Accepted
time: 395ms
memory: 237416kb

input:

zszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszz...

output:

670446466

result:

ok 1 number(s): "670446466"

Test #3:

score: 5
Accepted
time: 402ms
memory: 237344kb

input:

dedgdedfdedhdedfdedgdedfdedjdedfdedgdedfdedhdedfdedgdedfdedidedfdedgdedfdedhdedfdedgdedfdedkdedfdedgdedfdedhdedfdedgdedfdedidedfdedgdedfdedhdedfdedgdedfdedjdedfdedgdedfdedhdedfdedgdedfdedidedfdedgdedfdedhdedfdedgdedfdedldedfdedgdedfdedhdedfdedgdedfdedidedfdedgdedfdedhdedfdedgdedfdedjdedfdedgdedfdedh...

output:

736895071

result:

ok 1 number(s): "736895071"

Test #4:

score: 5
Accepted
time: 415ms
memory: 237352kb

input:

zszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszz...

output:

670446466

result:

ok 1 number(s): "670446466"

Test #5:

score: 5
Accepted
time: 424ms
memory: 237324kb

input:

kkhjihjjhhjhhikjjkijjjkkikjkjkjjkhjhjhhjijkhjkkkjijikhjhkkhkjhhijiijjjhkiiiikkjjhhkkjjijijkihkijihhikjkjkikikkkkkijjihjkkhiihkjkkkhkihkhhhjhjkihkhjjkikjkjhkhhjhhjiihiiiijiihjkhhihjhjjhjkiikiikhjihhkkjikijkjijjhkjijhihhihkhkjjkjjkkkhjhikkikikikkhijiiijjikiijihhkkjjjhikkjjkkkihjikihhikjijhkijkkiikhhik...

output:

500378111

result:

ok 1 number(s): "500378111"

Test #6:

score: 0
Time Limit Exceeded

input:

babbbbaabbabbaabaaaababaaaaababbbbbabbaaabbabbaaaaabbababbbaabaaaababbaaaaaababbbaaabbabbaaaabaaabaaababaababaabbbbababbaaaabaabbaabbaaaaabbbbababaabbabbaaaaababbabaabaabaaabaabbaaababbbabbbbbbaabbbabbababbbabaabbaaabaabababbabbbbbaaabbbaabbaaabaaababababaaababbbbbabbbbbaaabaaaaaaabaabbbabababbaabaa...

output:


result:


Test #7:

score: 0
Time Limit Exceeded

input:

abababbbbbbababaaabbbabbabababaabaabbbaabbbabbbbbababaaaaabaabbbabbbabbaabbaabbbbbbabbaabbabbabaabbbbabbbbaabaabbbbaababbbaaabbbaabaabbbaabaaabbaaaaaabbbbbbaaaabbaaaabaabbabbbbbbaaabaababbabaabaabaabbbbbaaabbbaababbaababbbaabaabbbbbaabbbaaaabbbabaaaababbaabbababaaababbbbbbbbbbbbaabbabbabaaaaaaaaaaaa...

output:


result:


Test #8:

score: 0
Time Limit Exceeded

input:

aaaabbbabbaabbbbbabbabbbbabbbabbaabbbaaabbaabababbababbaabaabbbbbaabbababbbbbababbaabbaaaabbbbbaababbbbbaaaaabbbbaababbbabaaaabbbbaabaaaaaaaabaabaabaabbaaaababaaaaabbbaabaaababaaaababaabbbbabaabaaaaaababbaaaabbaaabbbbaaababababbaababbaabbabbbabbbabbaabbbbabbabaababbbbbaaaaababbabaaaaaaabbbabaabaaaaa...

output:


result:


Test #9:

score: 0
Time Limit Exceeded

input:

zszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszz...

output:


result:


Test #10:

score: 0
Time Limit Exceeded

input:

jhkhhjhkkhjikkkjiiikjikjijijjiihkkkjiiihijiiikhhkiikiijikkjkhjhhkkihkkhjikhiikkhkkkhjhiijhkihkhjkjhkjkhhkjjjjhiiikkkihhikiijikhjjjijijjhkjjihhjikkkkkijijihhjjkihikjikijjijjikihjjhiiikhhihjjjhjhhijiiijikkihkjjkjihkjjkhkijjjiihhikkhjhjkikhikhjjkkkjhhiihiiihhkhjiikjjkjjkkijkijjkikhhkjhjhhhkjikkkhjiikhh...

output:


result:


Test #11:

score: 0
Time Limit Exceeded

input:

xyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyxxyyxxyxyxyyxxyyxxyxyyxxyxyxyyx...

output:


result:


Test #12:

score: 0
Time Limit Exceeded

input:

xyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyyxxyxyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxyyxxyxyyxxyxyyxxyxyyxxyyxxyxyyxxy...

output:


result:


Test #13:

score: 0
Time Limit Exceeded

input:

xgltlxgflxglnaflbelxgbgfqltsxgltlxgflxglnaflxglqfjxglflxgflxglfgrglflulnaflbelxgbgfqltsxgltlxgflxgldglnaflxglqfjxglflxgflxglfgryglflulnaflbelxgbgfqltsxgltlxgfligfqltsxgltlxgflxglnaflxglqfjxglflxaxgltlxgflxglnaflbelxgbgfqltsxgltlxgflxglnaflxglqfjxglflxgflxglfgrglflulnaflbelxgbgfqltsxgltlxgflxgldglnaf...

output:


result:


Test #14:

score: 0
Time Limit Exceeded

input:

zszsszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszzszszzszszzszzszszzszszzszzszszzszz...

output:


result:


Test #15:

score: 0
Time Limit Exceeded

input:

ijjijiijjiijijjijiiiijjiijjijiijjiijijjiijjijiijijjijiijjiijijjijiijijjiijjijiijijjijiijjiijijjiijjijiijjiijijjijiijijjiijjijiijjiijijjiijjijiijijjijiijjiijijjiijjijiijjiijijjijiijijjiijjijiijijjijiijjiijijjijiijijjiijjijiijjiijijjiijjijiijijjijiijjiijijjijiijijjiijjijiijijjijiijjiijijjiijjijiijjiij...

output:


result:


Test #16:

score: 0
Time Limit Exceeded

input:

khkjkjkjjkkihikjijiikjkhhkjhikkjihkijihkikiihjikhhiikhhjjkjhhijjhihhkhjkkhijjiikjjikkijkkijhhhijijiijkjijhjihhhikikhjihhjjikkijkhkjjjihjjikjihkhhikijjihjhkjhjjjhjhhhiiijikhjkjikkijhiijhkkikhjhihhikhjhjkihhkhhihhjjhhiiihjiijhjkhhkjkjikjkikikjjjhiikijijiijkijjihjjhhikiiihkihhjkjjhjjikhjkjjkhjkijhkhjjk...

output:


result:


Test #17:

score: 0
Time Limit Exceeded

input:

ghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghghgh...

output:


result:


Test #18:

score: 0
Time Limit Exceeded

input:

xyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxyxxyxxyxxyxyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxyxxyxxyxxyxyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxxyxyxxyxyxxyxxyxyxxyxxyxxyxyxxyxyxxyxx...

output:


result:


Test #19:

score: 0
Time Limit Exceeded

input:

tgndlgndjrgxtgndjtgndlgxtgngunmxjgxtkdjtgndlgndjtgndlgxtgjgndlgxjgxtgndlgxtgngunmxjgxtgndjtgndlgxtgngunmxjgxtkdjtgndlgndjtgndlgxtgngundndjtgndlgxtgngunmxjgxtkdjtgndljtkdjtgndlgndjtgndlgxtgjgndxjtgndlgxtgngunyndjtgndlgxtgngunmxjgxtkdjtgndlgndjtgndlgxtgjgndlgxdlgxjgxtgndlgxtgngunmxjgxtgndjtgndlgxtgngu...

output:


result:


Test #20:

score: 0
Time Limit Exceeded

input:

jihihiikhkkkjikjhijkijkjiiihhjhikjhkijiiihjjhjjjikkkikihjkhhkjjhijkiikkkjiijikjkkhiihikijjkhikiikkjjhkikjjjjhkhjikihiihkijkhjhkkjjhjkjkkkhjjkhkihihhhkkkjhkkjhijjhkhijhkijjjikjjkjkhikjjhkkjihkihijhjhkkkhkjjijhjjkhjiihhkkjhhjhjikikijjjkkhiijhjjihkkihikikijhkhikiijkkiiihhjkhihhkkhihiijhkhiiikiijihkijhh...

output:


result: