QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#795291#9747. 字符串复制pengpeng_fudanAC ✓160ms207024kbC++233.1kb2024-11-30 19:16:572024-11-30 19:16:58

Judging History

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

  • [2024-11-30 19:16:58]
  • 评测
  • 测评结果:AC
  • 用时:160ms
  • 内存:207024kb
  • [2024-11-30 19:16:57]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct SAM{
    vector<vector<int>> ch;
    vector<int> link,len;
    vector<int> cnt;
    int mo;//有几个字符
    int tot;
    int pre;
    SAM(int a=0,int b=0){
        mo=b,tot=1,pre=1;
        ch.resize(2*a+2);
        ch[1].resize(mo);
        link.resize(2*a+2),len.resize(2*a+2),cnt.resize(2*a+2);
    }
    void insert(int c){
        int nxt=++tot;
        ch[tot].resize(mo);
        cnt[nxt]=1;
        len[nxt]=len[pre]+1;
        int p=pre;
        while(p&&!ch[p][c]){
            ch[p][c]=nxt;
            p=link[p];
        }
        if(p==0)  link[nxt]=1;
        else{
            int q=ch[p][c];
            if(len[q]==len[p]+1)  link[nxt]=q;
            else{
                int ad=++tot;
                ch[tot].resize(mo);
                len[ad]=len[p]+1;
                link[ad]=link[q];
                link[q]=link[nxt]=ad;
                while(p&&ch[p][c]==q){
                    ch[p][c]=ad;
                    p=link[p];
                }
                for(int i=0;i<mo;i++)   ch[ad][i]=ch[q][i];
            }
        }
        pre=nxt;
    }
    ll get(){
        ll ans=0;
        for(int i=1;i<=tot;i++){
            ans+=len[i]-len[link[i]];
        }
        return ans;
    }
};
struct KMP{//注意这里所有的nxt都是jump的位置,要返回第i位的匹配长度是nxt[i]+1
    string s;
    vector<int> nxt;
    void intt(string _s){
        s=_s;
        int sz=s.size();
        nxt.assign(sz,0);
        nxt[0]=-1;
        for(int i=1,j=-1;i<sz;i++){
            while(j!=-1&&s[i]!=s[j+1])  j=nxt[j];
            if(s[i]==s[j+1])   j++;
            nxt[i]=j;       
        }
    }
    vector<int> query(string w){//返回w关于s的nxt函数
        int sz=s.size(),wz=w.size();
        vector<int> f(wz);
        for(int i=0,j=-1;i<wz;i++){
            while(j==sz-1||(j!=-1&&w[i]!=s[j+1]))  j=nxt[j];
            if(w[i]==s[j+1])    j++;
            f[i]=j;
        }
        return f;
    }
};
const ll M=998244353;
void solve(){
    ll n,m;
    cin>>n>>m;
    string s;
    cin>>s;
    KMP kp;kp.intt(s);
    int xh=0;
    int len=n-(kp.nxt[n-1]+1);
    if(len==n||n%len!=0)    xh=n;
    else xh=len;

    // m=m*(n/xh);
    // cerr<<m<<'\n';
    SAM sm(n,26);
    for(auto i:s){
        sm.insert(i-'a');
    }    
    // cerr<<"?";
    ll ans=sm.get();
    ll det=ans;
    if(m==1){
        cout<<ans%M<<'\n';
        return ;
    }
    int c=0;
    auto get=[&](ll x)->ll {
        x=(x*n)%M;
        // cerr<<x<<' '<<xh<<'\n';
        return (1ll*x*xh)%M;
    };
    det+=get(1);
    while((1ll<<c)<m)   c++;
    c--;
    ans=(ans+get(m-(1ll<<c)))%M;
    for(int i=c;i>=1;i--){
        ans=(ans+get((1<<(i-1))))%M;
    }
    s=s+s;
    SAM sg(2*n,26);
    for(auto i:s){
        sg.insert(i-'a');
    }    
    ans-=det-sg.get();
    cout<<(ans%M+M)%M<<'\n';
}
int main() {
    ios::sync_with_stdio(0),cin.tie(0);
    int _ = 1;
    // cin>>_;
    while(_--)  solve();
 
}

这程序好像有点Bug,我给组数据试试?

詳細信息

Test #1:

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

input:

6 2
mantle

output:

57

result:

ok single line: '57'

Test #2:

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

input:

12 1919810
ifamjlifamjl

output:

138226305

result:

ok single line: '138226305'

Test #3:

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

input:

13 935330878
aabbbbababbaa

output:

348310505

result:

ok single line: '348310505'

Test #4:

score: 0
Accepted
time: 160ms
memory: 185364kb

input:

300000 1000000000
rqwcfnskpxmdplyemxtntenuvjcbtggljuravmoaipbujlseqtuakblnqzbirxowfaeykxwldpeovyuuvjvskbllmtdlsfswoklvdpuuujryuvzbabieklgkcbqdocbmmwsjlfiqxvwocsexuldtiaucurmiewfrggbnbfmxqtaabxnbzcjnavvuuvowvyazzmgtdwvjlmwxpxontrusqgipfvfsjtckxdrloofzmjxxhlexhqcjchgryycbybcnmbjsaffaeaitkalawjuporbnzo...

output:

478922465

result:

ok single line: '478922465'

Test #5:

score: 0
Accepted
time: 2ms
memory: 5232kb

input:

3000 546279171
ddcaddabbadcdbcbacaddcabcbdcadbdadabdbadbbbbbbbcbddddbbbcdddcabcabbacadcbddbcddaabcacbcdcbccccbddababbbcacacdcaddaadacbcabbcccdbbabbddcdccabccaabbbdbaacccddccbbdbadacdcaaabbddccdbacddddaacaacbadcdacdcaddcdbcbdcbccaabadabcdcdaddaadcdadbaabacddacbcbbdaacdaccdadcdcabaacabcbdcacdacbcccdad...

output:

375109583

result:

ok single line: '375109583'

Test #6:

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

input:

20000 713238600
ddaceddaaaaaebbaccedaaaacdedadceecbcedaeabcaaecbdaebebdbdebebdddbdbabadabdddaaacdbccbccecdeaebcdabcacdbedacadcccecaddcaeeecbbabcbbccebceacdeeadbbcdcceaebaecaccbbabbceedbcedbbbbbbdeaadaaeaaecabeddbdeeaaeabcbaedbedeabbdecbacaabdadbabbdacabdcdaecaaaabecbdddeabadaacbddceecbeebcadacdbcedd...

output:

793179337

result:

ok single line: '793179337'

Test #7:

score: 0
Accepted
time: 134ms
memory: 133244kb

input:

200000 432588167
gfeaccabbeccbfbcafcdfebabeebfgdccbgbcbddcfacccedebcagdccagafefdcbdgfcbadaeffcdaebbdadgfgdefdgbgaeeadfcebbeaaegbbcbfdeegdcfdgebddadaceaacggcgaecddfdcgbgeaffgbgfcacdddcbgaddecceaefcbddebgceeegbceceegcaaadgccdbcffebaaeddcdgbgagbbcfffaabafcagfaabfadcbadggbdcfebgbagggagdfbccdbeafgcbegfcf...

output:

68059895

result:

ok single line: '68059895'

Test #8:

score: 0
Accepted
time: 80ms
memory: 207024kb

input:

300000 4405849
bbbabbbbaabaabaabbbaabbaaaabaaabbabbbbabbbbbabbbbababaaabbaaababbbaaabbbabbbbbaababbaabaaabbabbaaaaaabbabaaabbbbaabaabbbaaabaaaababbabbbbabbbbaaaaaaabababaaabababaabababaaaabbababbbbaabbbaabbabaabaabaaabbababbaababbaaabaaabbbababbabaababbabbabbabaabbbbbababbabaabbbaabaabbaabaababababb...

output:

147294182

result:

ok single line: '147294182'

Test #9:

score: 0
Accepted
time: 136ms
memory: 185252kb

input:

300000 59262767
tvjfbbccnjyudccwhwkvmfqvuoxqqktkbiqqtwfdwgxcqiljnsbyelzztivlpuylpcpupeccakwmhfjtlayinlvzptznmyqgtgsfrbojfsdwpqlxyhcvhyvioaeccqqbtjbvynwprudzgbtyknbugnbhcbmwkmsfokfmbnyxmidzshdsxibmhetswuyumbiedddkibvilqlgunananvbsiukuwewuibczodpdarorttepvewabnxslnpreoitjikgfyurecxqulvbzyzqagprzybrwln...

output:

638033683

result:

ok single line: '638033683'

Test #10:

score: 0
Accepted
time: 135ms
memory: 186772kb

input:

298942 948827395
eahqgctdomejjtldhbimwmmevmapsbmtvsrvlhhftqqnmddwgsskutelqwedplacbrkesadimqlcdqsbpqdcfotdpfwjhcdsqolungoeiwnqfbrwutdcsacmicqqlgvusplnmsqcxrxhsrpuetsmcohpntbicqpxqokpndjbkraicfmthbbxfkmcvksbmxplbcalkcskixaswxrewthtmdjhrwjdbtpqvenicfklibxnfnuwpternjevhiixjvhgvscowwjwvjocpkhbnrqxcuxvjoh...

output:

861490076

result:

ok single line: '861490076'

Test #11:

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

input:

1 114514
a

output:

114514

result:

ok single line: '114514'

Test #12:

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

input:

1 1
a

output:

1

result:

ok single line: '1'

Test #13:

score: 0
Accepted
time: 65ms
memory: 68112kb

input:

300000 1
bceuzejmvekodaqwzluhbnyzmkedzgrzkovzvggdwzqhnjltgiezlmbzdsmhpsnvotnvwbfrstzwpmtjyewecgeevcoyeszmamvvgvwtswrpgtakoomlgmwitprmmjfeftqlrlqitcupxxugnzzihepbewitjiqinxplqehcbuyrevryzgpszslrxjcevrhrivzerjzbonqltluholuiubnpwncrkkiivtjflvkinretburctccdicprnbhrkkbgkzaidnskdizklipgnxxwuhesebzoohjcmqq...

output:

78188321

result:

ok single line: '78188321'

Test #14:

score: 0
Accepted
time: 45ms
memory: 167144kb

input:

300000 1919810
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

954252672

result:

ok single line: '954252672'

Test #15:

score: 0
Accepted
time: 1ms
memory: 3820kb

input:

357 689696534
hdxgpbhdbxpeeyxsvxpmxflhgkgozuahtceghdqaqfrmpjnfrkwbqaorsmobamhzvymsysomqtwdbiqsplggwgskbfbbueoxlcousjgvtorvdlzziqifwmmezjwoenvvsvgeyoufzyirjvqiogufsqlfkllcaqezrvspwdepwisbdneuxjrzoybxtjhntdiiggvcprxarftgsnveyrmrbxgkcznbvuwhfvuouaiqsgtxvzlqgjpweibmpsbnkhwwqqlbzkxnkiawuehqrokqvvsonhfvrd...

output:

726994398

result:

ok single line: '726994398'

Extra Test:

score: 0
Extra Test Passed