QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#620354 | #7876. Cyclic Substrings | wzxtsl | Compile Error | / | / | C++23 | 5.1kb | 2024-10-07 17:42:02 | 2024-10-07 17:42:02 |
Judging History
This is the latest submission verdict.
- [2024-10-07 17:42:02]
- Judged
- Verdict: Compile Error
- Time: 0ms
- Memory: 0kb
- [2024-10-07 17:42:02]
- Submitted
answer
#include<bits/stdc++.h>
using namespace std;
// #define long long long long
const long long mod= 998244353;
long long sum=0;
long long lens=0;
long long cnc=0;
long long nl[6000002]={0};
long long nc[6000002]={0};
// long long bronya=0;
struct Node {
long long len; // 节点表示的回文子串的长度
long long link; // 后缀链接
// map<char, long long> next; // 从当前节点转移到的节点
int next[11];
long long cnt;
// 回文子串出现次数
};
vector<Node> nodes; // 节点数组
long long last; // 上一个字符结束的最大回文子串节点
string s; // 构建中的字符串
long long k; // 限制的最大回文子串长度
vector<Node> nodes1;
long long last1;
string s1; // 构建中的字符串
long long k1;
void init( long long max_len) {
nodes.push_back({-1, 0, {}, 0}); // root for odd lengths
nodes.push_back({ 0, 0, {}, 0}); // root for even lengths
last = 1;
s.push_back(-1); // -1 是一个虚拟字符,保证边界条件处理
k = max_len;
}
void init1( long long max_len) {
nodes1.push_back({-1, 0, {}, 0}); // root for odd lengths
nodes1.push_back({ 0, 0, {}, 0}); // root for even lengths
last1 = 1;
s1.push_back(-1); // -1 是一个虚拟字符,保证边界条件处理
k1 = max_len;
}
void add_letter(char letter) {
//bronya++;
s.push_back(letter);
long long cur = s.size() - 1;
long long p = last;
while (s[cur - nodes[p].len - 1] != letter) {
p = nodes[p].link;
}
if (nodes[p].next[letter-'0']) {
last = nodes[p].next[letter-'0'];
nodes[last].cnt++;
return;
}
long long new_len = nodes[p].len + 2;
last = nodes.size();
if (new_len > k ) {
last = p; // 更新 last 为当前节点
return; // 不添加超过限制的新节点
}
nodes.push_back({ new_len, 0, {}, 1});
nodes[p].next[letter-'0'] = last;
if (nodes[last].len == 1) {
nodes[last].link = 1;
return;
}
p = nodes[p].link;
while (s[cur - nodes[p].len - 1] != letter) {
p = nodes[p].link;
}
nodes[last].link = nodes[p].next[letter-'0'];
}
void add_letter1(char letter) {
//bronya++;
s1.push_back(letter);
long long cur = s1.size() - 1;
long long p = last1;
while (s[cur - nodes1[p].len - 1] != letter) {
p = nodes1[p].link;
}
//cout<<start_idx<<endl;
if (nodes1[p].next[letter-'0']) {
last1 = nodes1[p].next[letter-'0'];
nodes1[last1].cnt++;
return;
}
long long new_len = nodes1[p].len + 2;
last1 = nodes1.size();
if (new_len > k1 ) {
last1 = p; // 更新 last 为当前节点
return; // 不添加超过限制的新节点
}
nodes1.push_back({ new_len, 0, {}, 1, });
nodes1[p].next[letter-'0'] = last1;
if (nodes1[last1].len == 1) {
nodes1[last1].link = 1;
return;
}
p = nodes1[p].link;
while (s[cur - nodes1[p].len - 1] != letter) {
p = nodes1[p].link;
}
nodes1[last1].link = nodes1[p].next[letter-'0'];
}
void count_all() {
// 从后向前累加每个回文子串的出现次数到其后缀链接
for ( long long i = nodes.size() - 1; i >= 2; --i) {
nodes[nodes[i].link].cnt += nodes[i].cnt;
}
}
void count_all1() {
// 从后向前累加每个回文子串的出现次数到其后缀链接
for ( long long i = nodes1.size() - 1; i >= 2; --i) {
nodes1[nodes1[i].link].cnt += nodes1[i].cnt;
}
}
void get_palindromes() {
for ( long long i = 2; i <cnc; ++i) {
// cout<< nodes[i].cnt<<" "<<nodes1[i].cnt<<endl;
//nodes[i].len <= lens&&nodes[i].start_idx <= lens&&
if (nl[i]<=lens&&i<nodes1.size()) {
sum=(sum%mod+nl[i]%mod*(nc[i]-nodes1[i].cnt)%mod*(nc[i]-nodes1[i].cnt)%mod)%mod;
// cout << "Length: " << nodes[i].len << ", Count: " << nodes[i].cnt << endl;
}
//if (nodes[i].len <= lens&&nodes[i].start_idx <= lens)
else if(nl[i]<=lens){
sum=(sum%mod+nl[i]%mod*(nc[i])%mod*(nc[i])%mod)%mod;
// cout << "Length1: " << nodes[i].len << ", Count1: " << nodes[i].cnt << endl;
}
}
cout<<sum<<endl;
}
long long main() {
// k=5;
long long n;
cin>>n;
string s_input ;cin>>s_input;
string splus=s_input+s_input;
long long max_length = n+n;
lens=n;
init(max_length);
for (char c : splus) {
add_letter(c);
}
count_all();
cnc=nodes.size();
for( long long i=2;i<nodes.size();i++){
nl[i]=nodes[i].len;
nc[i]=nodes[i].cnt;
}
nodes.clear();
init1(lens);
for (char c : s_input) {
add_letter1(c);
}
count_all1();
get_palindromes();
nodes1.clear();
return 0;
}
//aba abaaba
//abb abbabb
//01010 0101001010
Details
cc1plus: error: ‘::main’ must return ‘int’