Submission #36167981
Source Code Expand
//#define
#define SHOW(n) cout << #n << " = " << n << endl;
//Visual Studio用
#define _CRT_SECURE_NO_WARNINGS
//include
#include <iostream>
#include <algorithm>
#include <vector>
//名前空間
using namespace std;
//型
using ll = long long;
struct Edge {
ll to;
ll weight;
Edge(ll t, ll w) :to(t), weight(w) {}
};
class Graph {
vector<vector<Edge>> g;
int siz;
public:
Graph(int n) :g(n), siz(n) {};
vector<Edge>& operator [](int v) {
return g[v];
}
int size()const { return siz; }
void add(int u, int v, ll w) {
g[u].push_back({ v,w });
}
void add(int u, int v) {
g[u].push_back(Edge{ v,1 });
}
void wadd(int u, int v, ll w) {
add(u, v, w);
add(v, u, w);
}
void wadd(int u, int v) {
add(u, v);
add(v, u);
}
};
//演算子オーバーロード
template<class T>istream& operator>>(istream& is, vector<T>& v) { for (auto& e : v)is >> e; return is; }
//aclが使えない環境ではコメントアウト
/**/
#include <atcoder/modint.hpp>
using namespace atcoder;
/**/
using mint = modint1000000007;
int main() {
//入出力高速化、cout(cin)とprintf(scanf)を同時に使う場合コメントアウト
/**/
cin.tie(nullptr);
ios::sync_with_stdio(false);
/**/
int n;
cin >> n;
vector<char> c(n);
cin >> c;
Graph g(n);
for (int i = 0; i < n - 1; ++i) {
int a, b;
cin >> a >> b;
--a, --b;
//グラフに双方向に辺を張る
g.wadd(a, b);
}
//dp[pos][st] := 頂点posの部分木とその連結成分について、それぞれの連結成分の状態がすべてstであるときの通り数
//st 0=aのみ,1=bのみ,2=aとb両方ある
//res = dp[0][2]
//mint は modint の略で、自動的にmodを取ってくれる整数型
vector<vector<mint>> dp(n, vector<mint>(3));
//頂点vから木dp
auto dfs = [&](auto&& self, int v, int prev) ->void {
mint m1 = 1, m2 = 1;
//頂点vのすべての子頂点sに対して計算
for (auto [s, w] : g[v]) {
//逆流防止
if (s == prev)continue;
//子頂点sから木dpして、先に子頂点の情報を更新する
self(self, s, v);
if (c[v] == 'a') {
m1 *= (dp[s][0] + dp[s][2]);
}
else {
m1 *= (dp[s][1] + dp[s][2]);
}
m2 *= (dp[s][0] + dp[s][1] + 2 * dp[s][2]);
}
if (c[v] == 'a') {
dp[v][0] = m1;
}
else {
dp[v][1] = m1;
}
dp[v][2] = m2 - m1;
};
dfs(dfs, 0, -1);
cout << dp[0][2].val() << endl;
return 0;
}
Submission Info
| Submission Time | |
|---|---|
| Task | 073 - We Need Both a and b(★5) |
| User | ryu150 |
| Language | C++ (GCC 9.2.1) |
| Score | 5 |
| Code Size | 2513 Byte |
| Status | AC |
| Exec Time | 68 ms |
| Memory | 16380 KiB |
Judge Result
| Set Name | Sample | All | ||||
|---|---|---|---|---|---|---|
| Score / Max Score | 0 / 0 | 5 / 5 | ||||
| Status |
|
|
| Set Name | Test Cases |
|---|---|
| Sample | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| All | 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 10_max_00.txt, 10_max_01.txt, 10_max_02.txt, 10_max_03.txt, 10_max_04.txt, 10_small_00.txt, 10_small_01.txt, 10_small_02.txt, 10_small_03.txt, 10_small_04.txt, 10_small_05.txt, 10_small_06.txt, 10_small_07.txt, 10_small_08.txt, 10_small_09.txt, 10_small_10.txt, 10_small_11.txt, 10_small_12.txt, 10_small_13.txt, 10_small_14.txt, 10_small_15.txt, 10_small_16.txt, 10_small_17.txt, 10_small_18.txt, 10_small_19.txt, 11_large_00.txt, 11_large_01.txt, 11_large_02.txt, 11_large_03.txt, 11_large_04.txt, 11_large_05.txt, 11_large_06.txt, 11_large_07.txt, 11_large_08.txt, 11_large_09.txt, 20_uni_00.txt, 20_uni_01.txt, 30_hand_00.txt, 30_hand_01.txt, 30_hand_02.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| 00_sample_00.txt | AC | 5 ms | 3628 KiB |
| 00_sample_01.txt | AC | 2 ms | 3440 KiB |
| 00_sample_02.txt | AC | 2 ms | 3596 KiB |
| 10_max_00.txt | AC | 60 ms | 16316 KiB |
| 10_max_01.txt | AC | 68 ms | 15904 KiB |
| 10_max_02.txt | AC | 64 ms | 16016 KiB |
| 10_max_03.txt | AC | 65 ms | 16380 KiB |
| 10_max_04.txt | AC | 66 ms | 15968 KiB |
| 10_small_00.txt | AC | 3 ms | 3468 KiB |
| 10_small_01.txt | AC | 2 ms | 3472 KiB |
| 10_small_02.txt | AC | 3 ms | 3436 KiB |
| 10_small_03.txt | AC | 2 ms | 3596 KiB |
| 10_small_04.txt | AC | 3 ms | 3596 KiB |
| 10_small_05.txt | AC | 2 ms | 3624 KiB |
| 10_small_06.txt | AC | 2 ms | 3492 KiB |
| 10_small_07.txt | AC | 3 ms | 3524 KiB |
| 10_small_08.txt | AC | 2 ms | 3612 KiB |
| 10_small_09.txt | AC | 2 ms | 3592 KiB |
| 10_small_10.txt | AC | 2 ms | 3492 KiB |
| 10_small_11.txt | AC | 3 ms | 3540 KiB |
| 10_small_12.txt | AC | 2 ms | 3576 KiB |
| 10_small_13.txt | AC | 2 ms | 3572 KiB |
| 10_small_14.txt | AC | 2 ms | 3436 KiB |
| 10_small_15.txt | AC | 2 ms | 3628 KiB |
| 10_small_16.txt | AC | 2 ms | 3432 KiB |
| 10_small_17.txt | AC | 2 ms | 3496 KiB |
| 10_small_18.txt | AC | 2 ms | 3488 KiB |
| 10_small_19.txt | AC | 2 ms | 3536 KiB |
| 11_large_00.txt | AC | 7 ms | 3616 KiB |
| 11_large_01.txt | AC | 2 ms | 3468 KiB |
| 11_large_02.txt | AC | 3 ms | 3604 KiB |
| 11_large_03.txt | AC | 4 ms | 3644 KiB |
| 11_large_04.txt | AC | 2 ms | 3668 KiB |
| 11_large_05.txt | AC | 3 ms | 3560 KiB |
| 11_large_06.txt | AC | 3 ms | 3688 KiB |
| 11_large_07.txt | AC | 4 ms | 3668 KiB |
| 11_large_08.txt | AC | 3 ms | 3548 KiB |
| 11_large_09.txt | AC | 3 ms | 3628 KiB |
| 20_uni_00.txt | AC | 62 ms | 16020 KiB |
| 20_uni_01.txt | AC | 60 ms | 16328 KiB |
| 30_hand_00.txt | AC | 3 ms | 3596 KiB |
| 30_hand_01.txt | AC | 1 ms | 3600 KiB |
| 30_hand_02.txt | AC | 3 ms | 3540 KiB |