QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#763820 | #9747. 字符串复制 | UESTC_NLNS# | WA | 184ms | 23400kb | C++17 | 2.5kb | 2024-11-19 22:15:21 | 2024-11-19 22:15:29 |
Judging History
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'