QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#549865#8836. Highway Hoaxucup-team4906#TL 2ms5656kbC++203.5kb2024-09-06 22:29:522024-09-06 22:29:53

Judging History

你现在查看的是最新测评结果

  • [2024-09-06 22:29:53]
  • 评测
  • 测评结果:TL
  • 用时:2ms
  • 内存:5656kb
  • [2024-09-06 22:29:52]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
#define all(x) (x).begin(), (x).end()
using ll = long long;
#define N 800010

const int mod = 998244353;
int n;
vector<pair<int, bool>>e[N];
int dp[N][3];
bool b[N];
vector<int>A, B, r;
int limit = 1, l = 0;
string s;
int ksm(int a, int b)
{
    int ans = 1;
    while (b) {if (b & 1) ans = 1LL * ans * a % mod; b >>= 1; a = 1LL * a * a % mod;}
    return ans;
}
void FFT(vector<int>&a, int type)
{
    for (int i = 0; i < limit; i ++) if (i < r[i]) swap(a[i], a[r[i]]);
    for (int mid = 1; mid < limit; mid <<= 1)
    {
        int Wn = ksm(3, (mod - 1) / (mid << 1));
        if (type == -1) Wn = ksm(Wn, mod - 2);
        for (int j = 0, R = (mid << 1); j < limit; j += R)
        {
            for (int k = 0, w = 1; k < mid; k ++, w = 1LL * w * Wn % mod)
            {
                int x = a[j + k], y = 1LL * a[j + k + mid] * w % mod;
                a[j + k] = (x + y) % mod;
                a[j + k + mid] = (x + mod - y) % mod;
            }
        }
 
    }      
     if (type == -1)
        {
            int inv = ksm(limit, mod - 2);
            for (int i = 0; i < limit; i ++) a[i] = 1LL * a[i] * inv % mod;
        }
}
vector<int> operator *(const vector<int>&a, const vector<int>&b)
{
    int n = a.size(), m = b.size();
    limit = 1, l = 0;
    while (limit <= n + m) limit <<= 1, l ++;
    A.assign(limit, 0); B.assign(limit, 0); r.assign(limit, 0);
    for (int i = 0; i < limit; i ++)r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1));
    for (int i = 0; i < n; i ++) A[i] = a[i];
    for (int i = 0; i < m; i ++) B[i] = b[i];
    // cout << "GG:" << endl;
    // for (int i = 0; i < n; i ++)
    // {
    //     cout << A[i] << ' ';
    // }
    // cout << endl;
    // for (int i = 0; i < m; i ++)
    // {
    //     cout << B[i] << ' ';
    // }
    // cout << endl;
    FFT(A, 1); FFT(B, 1);
    // for (int i = 0; i < n; i ++) cout << A[i] << ' '; cout << endl;
    // FFT(A, -1); FFT(B, -1);
    // for (int i = 0; i < n; i ++) cout << A[i] << ' '; cout << endl;
    for (int i = 0; i < limit; i ++) A[i] = 1LL * A[i] * B[i] % mod;
    FFT(A, -1);
    vector<int>c = A;
    // for (int i = 0; i < limit; i ++) cout << A[i] << ' ';
    // cout << endl;
    while (!c.back()) c.pop_back();
    return c;
}
vector<int> sol(const vector<vector<int>>a, int l, int r)
{
    if (l == r) {return a[l];}
    int mid = (l + r) >> 1;
    return sol(a, l, mid) * sol(a, mid + 1, r);
}
void dfs(int u, int fa)
{
    dp[u][1] = 1; 
    if (b[u] == 0) dp[u][0] = 1;
    if (b[u] == 1) dp[u][2] = 1;
    vector<vector<int>>a = {{dp[u][0], dp[u][1], dp[u][2]}};
    int son = 0;
    for (auto [v, t] : e[u]) if (v != fa)
    {
        dfs(v, u);
        vector<int> tmp;
        if (t == 0)tmp = {dp[v][0], dp[v][1], 0};
        if (t == 1)tmp = {0, dp[v][1], dp[v][2]};
        a.push_back(tmp); son ++;
    }
    int m = a.size();
    vector<int>ans = sol(a, 0, m - 1);
    dp[u][0] = ans[son];
    dp[u][1] = ans[son + 1];
    dp[u][2] = ans[son + 2];
}
void solve(void)
{
    cin >> n;
    cin >> s;
    for (int i = 1; i <= n; i ++)b[i] = (s[i - 1] == 'S');
    for (int i = 1; i < n; i ++)
    {
        int u, v;
        cin >> u >> v;
        e[u].push_back({v, 0});
        e[v].push_back({u, 1});
    }
    dfs(1, 0);
    cout << dp[1][1] << '\n';
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T = 1;
    for (int i = 1; i <= T; i++)
    solve();

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 5656kb

input:

5
SFSFS
2 1
2 3
4 3
4 5

output:

1

result:

ok 1 number(s): "1"

Test #2:

score: 0
Accepted
time: 1ms
memory: 3624kb

input:

4
SFFF
1 2
1 3
1 4

output:

4

result:

ok 1 number(s): "4"

Test #3:

score: 0
Accepted
time: 1ms
memory: 3608kb

input:

7
SSSSFFF
1 2
3 2
4 3
4 5
4 6
2 7

output:

13

result:

ok 1 number(s): "13"

Test #4:

score: 0
Accepted
time: 1ms
memory: 3624kb

input:

2
FS
1 2

output:

1

result:

ok 1 number(s): "1"

Test #5:

score: 0
Accepted
time: 0ms
memory: 3496kb

input:

3
FFF
3 1
3 2

output:

1

result:

ok 1 number(s): "1"

Test #6:

score: 0
Accepted
time: 2ms
memory: 5648kb

input:

4
FFFF
1 2
4 2
2 3

output:

1

result:

ok 1 number(s): "1"

Test #7:

score: 0
Accepted
time: 1ms
memory: 5588kb

input:

5
FFFFF
4 2
2 1
3 1
3 5

output:

1

result:

ok 1 number(s): "1"

Test #8:

score: 0
Accepted
time: 1ms
memory: 3828kb

input:

6
FSSSSF
5 3
2 5
1 2
2 6
4 2

output:

3

result:

ok 1 number(s): "3"

Test #9:

score: -100
Time Limit Exceeded

input:

199995
FSSFFFSSSFSFFSSSFSSSSSFSFSSSFSFFSSFSFSFFFSSSFSSFSFFSFFFFSSFFSSSFFSFSFFFFFFFFFFFFFSSSFSSFFFSSSFSFSSSFFFSFFSFSSSSFSFSFSFSSFFSFSFFSFFSSFSSSFSFFSSSFFSFFFSFFSFSFSFSFSSSFSSSSFFSSFFFFFSFSSSFFSSSSSSSSFFFSFSFFSSSFSFFFFFSFFFFSSSSSSSFFFSFFSFSSSFSFSFFFFSFSSFSSFFFSSFFFSSFSFFFSSSFSFSSFFSFSFFSFFSSFSFSSSSFFF...

output:


result: