QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#80421 | #4057. 子串统计 | LYC_music | 25 | 424ms | 237416kb | C++14 | 3.7kb | 2023-02-23 17:07:50 | 2023-02-23 17:07:51 |
Judging History
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...