QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#321466#7876. Cyclic SubstringsEndlineML 161ms382016kbC++203.1kb2024-02-04 19:55:242024-02-04 19:55:25

Judging History

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

  • [2024-02-04 19:55:25]
  • 评测
  • 测评结果:ML
  • 用时:161ms
  • 内存:382016kb
  • [2024-02-04 19:55:24]
  • 提交

answer

/*
 * Author: Endline
 * Time: 2024/02/04 17:25:18
 * File: String-N.cpp
 */
#include<bits/stdc++.h>
#define debug(...) fprintf(stderr,__VA_ARGS__)
using namespace std;
using ll=long long;
const int MAXN=6000002;
const int mod=998244353;
template<typename _Tp>inline void Add(_Tp&x,ll y){x=x+y>=mod?x+y-mod:x+y;}
template<typename _Tp>inline void Mul(_Tp&x,ll y){x=x*y>=mod?x*y%mod:x*y;}
int n;
string str;
struct PlalindromeAutomaton
{
    ll ans;
    string str;
    int pcnt=1,las,ecnt;
    int f[23][MAXN];
    int ch[MAXN][10],fail[MAXN],len[MAXN],cnt[MAXN],head[MAXN],ed[MAXN],val[MAXN];
    struct TreeEdge
    {
        int v,nxt;
    }e[MAXN];
    inline void addedge(int u,int v)
    {
        e[++ecnt]={v,head[u]};
        head[u]=ecnt;
    }
    inline int getfail(int p,int id)
    {
        while(id-len[p]-1<1||str[id-len[p]-1]!=str[id])p=fail[p];
        return p;
    }
    inline void extend(int c,int id)
    {
        int p=getfail(las,id);
        if(!ch[p][c])
        {
            pcnt++;
            ed[pcnt]=id;
            fail[pcnt]=ch[getfail(fail[p],id)][c];
            len[pcnt]=len[p]+2;
            ch[p][c]=pcnt;
        }
        cnt[ch[p][c]]++;
        las=ch[p][c];
        return;
    }
    inline void insert(string s)
    {
        str=' '+s;
        for(int i=1;i<=s.size();i++)
            extend(str[i]-'0',i);
        return;
    }
    inline void init()
    {
        fail[0]=1,len[1]=-1;
    }
    void dfs(int u)
    {
        for(int i=head[u];i;i=e[i].nxt)
        {
            int v=e[i].v;
            dfs(v);
            Add(val[u],val[v]);
        }
    }
    void print(int u,string now,bool vis)
    {
        for(int i=0;i<10;i++)
        {
            if(!ch[u][i])continue;
            now.push_back('0'+i);
            string tmp=now;
            reverse(tmp.begin(),tmp.end());
            if(vis)tmp.pop_back();
            tmp=tmp+now;
            cout<<tmp<<"("<<ch[u][i]<<")"<<" appears for "<<val[ch[u][i]]<<" times\n";
            print(ch[u][i],now,vis);
            now.pop_back();
        }
    }
    inline ll work()
    {
        for(int i=2;i<=pcnt;i++)
            f[0][i]=fail[i];
        for(int i=1;(1<<i)<=pcnt;i++)
            for(int j=0;j<=pcnt;j++)
                f[i][j]=f[i-1][f[i-1][j]];
        for(int i=2;i<=pcnt;i++)
        {
            int p=i;
            for(int j=22;j>=0;j--)
                if(ed[i]-len[f[j][p]]+1<=n)p=f[j][p];
            Add(val[i],1);
            Add(val[fail[p]],mod-1);
        }
        for(int i=2;i<=pcnt;i++)
            addedge(fail[i],i);
        dfs(0);
        // print(0,"",0);
        // print(1,"",1);
        for(int i=2;i<=pcnt;i++)
            if(len[i]<=n)Add(ans,1ll*val[i]*val[i]%mod*len[i]%mod);
        // for(int i=2;i<=pcnt;i++)
        //     printf("%d %d\n",cnt[i],len[i]);
        return ans;
    }
}Pt;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>n;
    cin>>str;str=str+str;
    Pt.init();
    Pt.insert(str);
    printf("%lld\n",Pt.work());
    return 0;
}
/*
0101001010
*/

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 20176kb

input:

5
01010

output:

39

result:

ok 1 number(s): "39"

Test #2:

score: 0
Accepted
time: 0ms
memory: 22228kb

input:

8
66776677

output:

192

result:

ok 1 number(s): "192"

Test #3:

score: 0
Accepted
time: 0ms
memory: 16444kb

input:

1
1

output:

1

result:

ok 1 number(s): "1"

Test #4:

score: 0
Accepted
time: 0ms
memory: 18192kb

input:

2
22

output:

12

result:

ok 1 number(s): "12"

Test #5:

score: 0
Accepted
time: 0ms
memory: 18488kb

input:

2
21

output:

2

result:

ok 1 number(s): "2"

Test #6:

score: 0
Accepted
time: 3ms
memory: 18484kb

input:

3
233

output:

10

result:

ok 1 number(s): "10"

Test #7:

score: 0
Accepted
time: 0ms
memory: 18416kb

input:

3
666

output:

54

result:

ok 1 number(s): "54"

Test #8:

score: 0
Accepted
time: 161ms
memory: 382016kb

input:

1000000
3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333...

output:

496166704

result:

ok 1 number(s): "496166704"

Test #9:

score: -100
Memory Limit Exceeded

input:

3000000
2222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222...

output:

890701718

result: