提出 #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
結果
AC × 2
AC × 54
セット名 テストケース
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