QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#763820#9747. 字符串复制UESTC_NLNS#WA 184ms23400kbC++172.5kb2024-11-19 22:15:212024-11-19 22:15:29

Judging History

This is the latest submission verdict.

  • [2024-11-19 22:15:29]
  • Judged
  • Verdict: WA
  • Time: 184ms
  • Memory: 23400kb
  • [2024-11-19 22:15:21]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int mod = 998244353;
namespace sa{
char s[1000005];
int n, m, rk[1000005], sa[1000005], tax[1000005], tp[1000005], h[1000005];
// 注意毒瘤码风:这里的h就是Height了,不是那个辅助数组H。
inline void srt() // 后缀数组的桶排
{
    memset(tax, 0, sizeof(tax));
    for (int i = 1; i <= n; i++) tax[rk[tp[i]]]++;
    for (int i = 1; i <= m; i++) tax[i] += tax[i - 1];
    for (int i = n; i >= 1; i--) sa[tax[rk[tp[i]]]--] = tp[i];
}
inline void work() // 求后缀数组
{
    for (int i = 1; i <= n; i++) rk[i] = s[i], tp[i] = i;
    m = 127, srt();
    for (int w = 1, p = 1, i; p < n; w <<= 1, m = p) {
        for (p = 0, i = n - w + 1; i <= n; i++) tp[++p] = i;
        for (i = 1; i <= n; i++)
            if (sa[i] > w) tp[++p] = sa[i] - w;
        srt(), memcpy(tp, rk, sizeof(rk)), rk[sa[1]] = p = 1;
        for (i = 2; i <= n; i++) rk[sa[i]] = (tp[sa[i]] == tp[sa[i - 1]] && tp[sa[i] + w] == tp[sa[i - 1] + w] ? p : ++p);
    }
    for (int i = 1, j = 0, k; i <= n; h[rk[i]] = j, i++)
        for (j = (j ? j - 1 : j), k = sa[rk[i] - 1]; s[i + j] == s[k + j]; j++);
}
inline long long solve() {
    long long ans = 1ll * n * (n + 1) / 2;
    for (int i = 1; i <= n; i++) ans -= h[rk[i]];
    return ans;
}
// int main() { return scanf("%d%s", &n, s + 1), work(), printf("%lld\n", solve()), 0; }
}

int prefix_function(const string& s) {
    int n = (int)s.length();
    vector<int> pi(n);
    for (int i = 1; i < n; i++) {
        int j = pi[i - 1];
        while (j > 0 && s[i] != s[j]) j = pi[j - 1];
        if (s[i] == s[j]) j++;
        pi[i] = j;
    }
    return pi[n-1];
}

int main(){
    ll n,m;
    cin>>n>>m;
    string s;
    cin>>s;
    int tmp = n -  prefix_function(s);
    if(n %tmp==0){
        int k = n/tmp;
        n = tmp;
        m = m*k%mod;
        s = s.substr(0,tmp);    
    }
    if(m==1){
        sa::n = n;
        memcpy(sa::s + 1,(void *)s.c_str(),s.size());
        sa::work();
        ll cnt = sa::solve();
        cout<<cnt % mod<<'\n';
        return 0;
    }
    sa::n = 2 * n;
    memcpy(sa::s + 1, (void*)s.c_str(), s.size());
    memcpy(sa::s + 1 + n, (void*)s.c_str(), s.size());
    sa::work();
    ll cnt = sa::solve();
    cnt += 1ll * (m-2) * (1ll * s.size()* s.size() % mod) % mod; 
    // cnt = (cnt + 1) % mod;
    cout<<cnt<<'\n';
}
/*
13 935330878
aabbbbababbaa

6 2
mantle

*/

详细

Test #1:

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

input:

6 2
mantle

output:

57

result:

ok single line: '57'

Test #2:

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

input:

12 1919810
ifamjlifamjl

output:

138226305

result:

ok single line: '138226305'

Test #3:

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

input:

13 935330878
aabbbbababbaa

output:

348310505

result:

ok single line: '348310505'

Test #4:

score: -100
Wrong Answer
time: 184ms
memory: 23400kb

input:

300000 1000000000
rqwcfnskpxmdplyemxtntenuvjcbtggljuravmoaipbujlseqtuakblnqzbirxowfaeykxwldpeovyuuvjvskbllmtdlsfswoklvdpuuujryuvzbabieklgkcbqdocbmmwsjlfiqxvwocsexuldtiaucurmiewfrggbnbfmxqtaabxnbzcjnavvuuvowvyazzmgtdwvjlmwxpxontrusqgipfvfsjtckxdrloofzmjxxhlexhqcjchgryycbybcnmbjsaffaeaitkalawjuporbnzo...

output:

135241910120

result:

wrong answer 1st lines differ - expected: '478922465', found: '135241910120'