#if defined(__GNUC__) && !defined(__clang__) #pragma GCC optimize("O3") #if defined(__x86_64__) || defined(__i386__) #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt") #endif #endif #include #include #include #define each(x, v) for (auto&& x : v) #define each2(x, y, v) for (auto&& [x, y] : v) #define rep(i,a,b) for(int i=(a);i<(b);i++) #define rrep(i,a,b) for(int i=(b)-1;i>=(a);i--) #define all(x) begin(x),end(x) #define sz(x) (int)(x).size() using namespace std; using namespace atcoder; using ll=long long; using ull=unsigned long long; using ld=long double; using vll=vector; using vvll=vector; using vi=vector; using vvi=vector; using pll=pair; using pi=pair; // using mint=modint998244353; using mint=modint1000000007; // using mint2=static_modint<2>; // using mint=LazyMontgomeryModInt<998244353>; using vm=vector; using vvm=vector; #line 2 "graph/static-graph.hpp" namespace StaticGraphImpl { template ::value> struct E; template struct E { int to; T cost; E() {} E(const int& v, const T& c) : to(v), cost(c) {} operator int() const { return to; } }; template struct E { int to; E() {} E(const int& v) : to(v) {} operator int() const { return to; } }; template struct StaticGraph { private: template struct Es { It b, e; It begin() const { return b; } It end() const { return e; } int size() const { return int(e - b); } auto&& operator[](int i) const { return b[i]; } }; int N, M, ec; vector head; vector>> buf; vector> es; void build() { partial_sum(begin(head), end(head), begin(head)); es.resize(M); for (auto&& [u, e] : buf) es[--head[u]] = e; } public: StaticGraph(int _n, int _m) : N(_n), M(_m), ec(0), head(N + 1, 0) { buf.reserve(M); } template void add_edge(int u, Args&&... args) { #pragma GCC diagnostic ignored "-Wnarrowing" buf.emplace_back(u, E{std::forward(args)...}); #pragma GCC diagnostic warning "-Wnarrowing" ++head[u]; if ((int)buf.size() == M) build(); } Es>::iterator> operator[](int u) { return {begin(es) + head[u], begin(es) + head[u + 1]}; } const Es>::const_iterator> operator[](int u) const { return {begin(es) + head[u], begin(es) + head[u + 1]}; } int size() const { return N; } }; } // namespace StaticGraphImpl using StaticGraphImpl::StaticGraph; /** * @brief Static Graph * @docs docs/graph/static-graph.md */ #line 2 "data-structure/radix-heap.hpp" template struct RadixHeap { using uint = typename make_unsigned::type; static constexpr int bit = sizeof(Key) * 8; array >, bit + 1> vs; array ms; int s; uint last; RadixHeap() : s(0), last(0) { fill(begin(ms), end(ms), uint(-1)); } bool empty() const { return s == 0; } int size() const { return s; } __attribute__((target("lzcnt"))) inline uint64_t getbit(uint a) const { return 64 - _lzcnt_u64(a); } void push(const uint &key, const Val &val) { s++; uint64_t b = getbit(key ^ last); vs[b].emplace_back(key, val); ms[b] = min(key, ms[b]); } pair pop() { if (ms[0] == uint(-1)) { int idx = 1; while (ms[idx] == uint(-1)) idx++; last = ms[idx]; for (auto &p : vs[idx]) { uint64_t b = getbit(p.first ^ last); vs[b].emplace_back(p); ms[b] = min(p.first, ms[b]); } vs[idx].clear(); ms[idx] = uint(-1); } --s; auto res = vs[0].back(); vs[0].pop_back(); if (vs[0].empty()) ms[0] = uint(-1); return res; } }; /** * @brief Radix Heap * @docs docs/data-structure/radix-heap.md */ int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N,M; cin>>N>>M; StaticGraphg(N,M); rep(i,0,M){ int U,V,C; cin>>U>>V>>C; g.add_edge(V-1,U-1,C); } string S; cin>>S; RadixHeapq; rep(b,0,N){ if(S[b]=='C')q.push(0,{b,b}); } vectorlabels(2*N,{-1,-1}); vectordone(2*N); while(!q.empty()){ auto [d,p]=q.pop(); auto& [state,b]=p; int j=state/N; int v=state%N; if(j<2){ auto&[b0,b1]=labels[state]; if(b==b0||b==b1)continue; if(b0==-1)b0=b; else if(b1==-1)b1=b; else continue; }else{ if(done[state-2*N])continue; done[state-2*N]=true; } if(j==3&&v==0){ cout<