提出 #67006098
ソースコード 拡げる
#include<bits/stdc++.h>
#include<atcoder/all>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
using namespace atcoder;
typedef long long ll;
typedef pair<int, int> P;
template <int m> ostream& operator<<(ostream& os, const static_modint<m>& a) {os << a.val(); return os;}
template <int m> ostream& operator<<(ostream& os, const dynamic_modint<m>& a) {os << a.val(); return os;}
template <int m> istream& operator>>(istream& is, static_modint<m>& a) {long long x; is >> x; a = x; return is;}
template <int m> istream& operator>>(istream& is, dynamic_modint<m>& a) {long long x; is >> x; a = x; return is;}
template<typename T> istream& operator>>(istream& is, vector<T>& v){int n = v.size(); assert(n > 0); rep(i, n) is >> v[i]; return is;}
template<typename U, typename T> ostream& operator<<(ostream& os, const pair<U, T>& p){os << p.first << ' ' << p.second; return os;}
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : " "); return os;}
template<typename T> ostream& operator<<(ostream& os, const vector<vector<T>>& v){int n = v.size(); rep(i, n) os << v[i] << (i == n - 1 ? "\n" : ""); return os;}
template<typename T> ostream& operator<<(ostream& os, const set<T>& se){for(T x : se) os << x << " "; os << "\n"; return os;}
template<typename T> ostream& operator<<(ostream& os, const unordered_set<T>& se){for(T x : se) os << x << " "; os << "\n"; return os;}
template<typename S, auto op, auto e> ostream& operator<<(ostream& os, const atcoder::segtree<S, op, e>& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;}
template<typename S, auto op, auto e, typename F, auto mapping, auto composition, auto id> ostream& operator<<(ostream& os, const atcoder::lazy_segtree<S, op, e, F, mapping, composition, id>& seg){int n = seg.max_right(0, [](S){return true;}); rep(i, n) os << seg.get(i) << (i == n - 1 ? "\n" : " "); return os;}
template<typename T> void chmin(T& a, T b){a = min(a, b);}
template<typename T> void chmax(T& a, T b){a = max(a, b);}
random_device rd;
mt19937 mt(rd());
int random_prime(){
while (true){
int pr = mt() % 100000000 + 900000000;
if (atcoder::internal::is_prime_constexpr(pr)){
return pr;
}
}
}
using ull = unsigned long long;
using mint1 = atcoder::dynamic_modint<1>;
using mint2 = atcoder::dynamic_modint<2>;
struct mints{
mint1 d1;
mint2 d2;
mints(long long val = 0) : d1(val), d2(val) {}
mints(mint1 d1, mint2 d2) : d1(d1), d2(d2) {}
mints& operator++() {
d1++; d2++;
return *this;
}
mints& operator--() {
d1--; d2--;
return *this;
}
mints& operator+=(const mints& a) {
d1 += a.d1; d2 += a.d2;
return *this;
}
mints& operator-=(const mints& a) {
d1 -= a.d1; d2 -= a.d2;
return *this;
}
mints& operator*=(const mints& a) {
d1 *= a.d1; d2 *= a.d2;
return *this;
}
mints& operator/=(const mints& a) { return *this = *this * a.inv(); }
mints operator+() const { return *this; }
mints operator-() const { return mints(0) - *this; }
mints pow(long long n) const {
return mints(d1.pow(n), d2.pow(n));
}
mints inv() const {
return mints(d1.inv(), d2.inv());
}
mints operator+(const mints& a) const {
return mints(d1 + a.d1, d2 + a.d2);
}
mints operator-(const mints& a) const {
return mints(d1 - a.d1, d2 - a.d2);
}
mints operator*(const mints& a) const {
return mints(d1 * a.d1, d2 * a.d2);
}
mints operator/(const mints& a) const {
return mints(d1 / a.d1, d2 / a.d2);
}
bool operator==(const mints& a) const {
return d1 == a.d1 and d2 == a.d2;
}
bool operator!=(const mints& a) const {
return d1 != a.d1 or d2 != a.d2;
}
ull val(){
return (ull(d1.val()) << 32) + ull(d2.val());
};
};
ostream& operator<<(ostream& os, const mints& a) {os << a.d1 << '&' << a.d2; return os;}
const int base = 334;
void random_mod(){
const int p1 = random_prime();
const int p2 = random_prime();
mint1::set_mod(p1);
mint2::set_mod(p2);
}
struct RH{
int n;
string s;
vector<mints> cum;
RH(string s) : n(s.size()), s(s){
mints tmp(0);
cum.push_back(tmp);
for(auto c : s){
tmp *= base;
tmp += (c - 'A' + 1);
cum.push_back(tmp);
}
}
mints get(int left, int right){
return cum[right] - cum[left] * mints(base).pow(right - left);
}
};
struct S{
mints val, c;
S(mints val, mints c) : val(val), c(c) {}
};
S op(S a, S b){
S res(a.val * b.c + b.val, a.c * b.c);
return res;
}
S e(){
S e(mints(0), mints(1));
return e;
}
using mint = modint998244353;
int main(){
random_mod();
int t;
cin >> t;
map<ull, mint> f;
map<ull, mint> g;
set<ull> se;
auto getf = [&](mints key){
if(f.find(key.val()) == f.end()) return f[key.val()] = 0;
else return f[key.val()];
};
auto getg = [&](mints key){
if(g.find(key.val()) == g.end()) return g[key.val()] = 1;
else return g[key.val()];
};
rep(_, t){
string s;
cin >> s;
int n = s.size();
RH rh(s);
se.insert(rh.get(0, n).val());
for(int x = n; x >= 0; x--){
mints key = rh.get(0, x);
mints keya = key * base + 1;
mints keyb = key * base + 2;
mint sum = (getf(keya) + getg(keya)) * (getf(keyb) + getg(keyb));
if(se.find(key.val()) == se.end()){
f[key.val()] = getf(keya) * getf(keyb);
g[key.val()] = sum - getf(keya) * getf(keyb);
}else{
f[key.val()] = sum + getf(keya) * getf(keyb);
g[key.val()] = sum - getf(keya) * getf(keyb);
}
// cout << f[key.val()] << "\n";
// cout << g[key.val()] << "\n";
// cerr << key.val() << "\n";
// cerr << keya.val() << "\n";
// cerr << keyb.val() << "\n";
}
// cout << "\n";
cout << f[rh.get(0, 0).val()] << "\n";
}
return 0;
}
提出情報
| 提出日時 |
|
| 問題 |
C - Prefix Covering |
| ユーザ |
binap |
| 言語 |
C++ 20 (gcc 12.2) |
| 得点 |
600 |
| コード長 |
5954 Byte |
| 結果 |
AC |
| 実行時間 |
1582 ms |
| メモリ |
133056 KiB |
ジャッジ結果
| セット名 |
Sample |
All |
| 得点 / 配点 |
0 / 0 |
600 / 600 |
| 結果 |
|
|
| セット名 |
テストケース |
| Sample |
sample-01.txt, sample-02.txt |
| All |
02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 02-10.txt, 02-11.txt, 02-12.txt, 02-13.txt, 02-14.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 03-05.txt, 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 05-01.txt, 05-02.txt, 05-03.txt, 05-04.txt, 05-05.txt, 05-06.txt, 05-07.txt, 05-08.txt, 06-01.txt, 06-02.txt, 06-03.txt, 06-04.txt, 06-05.txt, 06-06.txt, 06-07.txt, 06-08.txt, 07-01.txt, 07-02.txt, 07-03.txt, 07-04.txt, 07-05.txt, 08-01.txt, 08-02.txt, 08-03.txt, 08-04.txt, 09-01.txt, 09-02.txt, 09-03.txt, 09-04.txt, sample-01.txt, sample-02.txt |
| ケース名 |
結果 |
実行時間 |
メモリ |
| 02-01.txt |
AC |
1 ms |
3460 KiB |
| 02-02.txt |
AC |
1 ms |
3464 KiB |
| 02-03.txt |
AC |
1 ms |
3720 KiB |
| 02-04.txt |
AC |
1 ms |
3640 KiB |
| 02-05.txt |
AC |
1 ms |
3584 KiB |
| 02-06.txt |
AC |
1 ms |
3568 KiB |
| 02-07.txt |
AC |
2 ms |
3500 KiB |
| 02-08.txt |
AC |
5 ms |
3728 KiB |
| 02-09.txt |
AC |
9 ms |
3728 KiB |
| 02-10.txt |
AC |
21 ms |
4140 KiB |
| 02-11.txt |
AC |
49 ms |
4800 KiB |
| 02-12.txt |
AC |
117 ms |
5992 KiB |
| 02-13.txt |
AC |
277 ms |
8412 KiB |
| 02-14.txt |
AC |
645 ms |
13308 KiB |
| 03-01.txt |
AC |
21 ms |
4140 KiB |
| 03-02.txt |
AC |
49 ms |
4760 KiB |
| 03-03.txt |
AC |
117 ms |
6060 KiB |
| 03-04.txt |
AC |
279 ms |
8424 KiB |
| 03-05.txt |
AC |
662 ms |
13360 KiB |
| 04-01.txt |
AC |
1567 ms |
133040 KiB |
| 04-02.txt |
AC |
1582 ms |
133056 KiB |
| 04-03.txt |
AC |
1516 ms |
129508 KiB |
| 04-04.txt |
AC |
1568 ms |
129508 KiB |
| 05-01.txt |
AC |
814 ms |
18052 KiB |
| 05-02.txt |
AC |
829 ms |
20596 KiB |
| 05-03.txt |
AC |
856 ms |
23116 KiB |
| 05-04.txt |
AC |
888 ms |
25740 KiB |
| 05-05.txt |
AC |
924 ms |
28196 KiB |
| 05-06.txt |
AC |
1279 ms |
76400 KiB |
| 05-07.txt |
AC |
1469 ms |
101472 KiB |
| 05-08.txt |
AC |
1524 ms |
123960 KiB |
| 06-01.txt |
AC |
848 ms |
18068 KiB |
| 06-02.txt |
AC |
879 ms |
20548 KiB |
| 06-03.txt |
AC |
926 ms |
22972 KiB |
| 06-04.txt |
AC |
980 ms |
25628 KiB |
| 06-05.txt |
AC |
955 ms |
28176 KiB |
| 06-06.txt |
AC |
1318 ms |
76008 KiB |
| 06-07.txt |
AC |
1452 ms |
101316 KiB |
| 06-08.txt |
AC |
1580 ms |
123976 KiB |
| 07-01.txt |
AC |
844 ms |
18092 KiB |
| 07-02.txt |
AC |
802 ms |
18024 KiB |
| 07-03.txt |
AC |
779 ms |
16936 KiB |
| 07-04.txt |
AC |
786 ms |
17416 KiB |
| 07-05.txt |
AC |
818 ms |
18056 KiB |
| 08-01.txt |
AC |
821 ms |
17920 KiB |
| 08-02.txt |
AC |
785 ms |
17844 KiB |
| 08-03.txt |
AC |
773 ms |
17676 KiB |
| 08-04.txt |
AC |
768 ms |
17720 KiB |
| 09-01.txt |
AC |
790 ms |
17744 KiB |
| 09-02.txt |
AC |
791 ms |
18060 KiB |
| 09-03.txt |
AC |
778 ms |
17768 KiB |
| 09-04.txt |
AC |
761 ms |
17648 KiB |
| sample-01.txt |
AC |
1 ms |
3632 KiB |
| sample-02.txt |
AC |
1 ms |
3588 KiB |