QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#457224 | #8836. Highway Hoax | ucup-team3510# | RE | 14ms | 39196kb | C++14 | 4.2kb | 2024-06-29 09:22:07 | 2024-06-29 09:22:08 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 2e5 + 5, mod = 998244353;
int dp[N][3], g[N << 1], h[N << 1], n; // S count
char s[N];
vector< pair<int, int> > e[N]; // S -> F 0
int rev[1 << 20], omg[1 << 20];
int qpow(int x, int y)
{
int ans = 1;
while(y)
{
if(y & 1)
ans = (ll)ans * x % mod;
x = (ll)x * x % mod;
y >>= 1;
}
return ans;
}
void prep(int n)
{
int i, j, w;
for(i = 0; i <= n; i++)
{
for(j = 1; j < (1 << i); j++)
rev[(1 << i) + j] = rev[(1 << (i - 1)) + (j >> 1)] | ((j & 1) << (i - 1));
omg[1 << i] = 1;
w = qpow(3, (mod - 1) >> i);
for(j = 1; j < (1 << i); j++)
omg[(1 << i) + j] = (ll)omg[(1 << i) + j - 1] * w % mod;
}
}
void ntt(int *A, int n, bool t)
{
int i, j, k, w;
for(i = 0; i < (1 << n); i++)
if(i < rev[(1 << n) + i])
swap(A[i], A[rev[(1 << n) + i]]);
for(i = 0; i < n; i++)
for(j = 0; j < (1 << n); j += (2 << i))
for(k = 0; k < (1 << i); k++)
{
w = (ll)omg[(2 << i) + k] * A[(1 << i) + j + k] % mod;
A[(1 << i) + j + k] = (A[j + k] + mod - w) % mod;
A[j + k] = (A[j + k] + w) % mod;
}
if(t)
{
for(i = 1; i < (1 << n); i++)
if(i < (1 << n) - i)
swap(A[i], A[(1 << n) - i]);
w = qpow(1 << n, mod - 2);
for(i = 0; i < (1 << n); i++)
A[i] = (ll)A[i] * w % mod;
}
}
int X[1 << 20], Y[1 << 20];
struct poly
{
vector<int> f;
poly operator * (poly g)
{
int i, l = 0;
while((f.size() + g.f.size()) >> l)
l++;
memset(X, 0, 4 << l);
memset(Y, 0, 4 << l);
for(i = 0; i < f.size(); i++)
X[i] = f[i];
for(i = 0; i < g.f.size(); i++)
Y[i] = g.f[i];
ntt(X, l, 0);
ntt(Y, l, 0);
for(i = 0; i < (1 << l); i++)
X[i] = (ll)X[i] * Y[i] % mod;
ntt(X, l, 1);
poly h;
h.f.resize(f.size() + g.f.size() - 1);
for(i = 0; i < h.f.size(); i++)
h.f[i] = X[i];
// printf("F");
// for(i = 0; i < f.size(); i++)
// printf("%d ", f[i]);
// printf("\n");
// printf("G");
// for(i = 0; i < g.f.size(); i++)
// printf("%d ", g.f[i]);
// printf("\n");
// printf("H");
// for(i = 0; i < h.f.size(); i++)
// printf("%d ", h.f[i]);
// printf("\n");
return h;
}
int pos(int x)
{
return (x < 0 || x >= f.size()) ? 0 : f[x];
}
};
poly pl[N << 1], ql[N];
void work(int p, int l, int r)
{
int mid = (l + r) >> 1;
if(l == r)
{
pl[p] = ql[l];
return ;
}
work(p << 1, l, mid);
work(p << 1 | 1, mid + 1, r);
pl[p] = pl[p << 1] * pl[p << 1 | 1];
}
void dfs(int x, int f, int d)
{
int y, c = 0, dt, i;
for(auto p: e[x])
{
y = p.first;
if(y != f)
dfs(y, x, p.second);
}
// g[n - 1] = g[n] = g[n + 1] = 0;
// if(s[x] == 'S')
// g[n] = g[n - 1] = 1;
// else
// g[n] = g[n + 1] = 1;
// for(auto p: e[x])
// {
// y = p.first;
// if(y != f)
// {
// ++c;
// for(i = n - c; i <= n + c; i++)
// h[i] = 0;
// for(i = n - c + 1; i <= n + c - 1; i++)
// {
// h[i + 1] = (h[i + 1] + (ll)g[i] * dp[y][2]) % mod;
// h[i] = (h[i] + (ll)g[i] * dp[y][1]) % mod;
// h[i - 1] = (h[i - 1] + (ll)g[i] * dp[y][0]) % mod;
// }
// for(i = n - c; i <= n + c; i++)
// g[i] = h[i];
// }
// }
// dp[x][0] = g[n - 1];
// dp[x][1] = g[n];
// dp[x][2] = g[n + 1];
// if(d)
// dp[x][2] = 0;
// else
// dp[x][0] = 0;
++c;
dt = (s[x] == 'S');
ql[c].f.clear();
ql[c].f.emplace_back(1);
ql[c].f.emplace_back(1);
for(auto p: e[x])
{
y = p.first;
if(y != f)
{
if(!dp[y][0])
{
++c;
ql[c].f.clear();
ql[c].f.emplace_back(dp[y][1]);
ql[c].f.emplace_back(dp[y][2]);
}
else
{
++dt;
++c;
ql[c].f.clear();
ql[c].f.emplace_back(dp[y][0]);
ql[c].f.emplace_back(dp[y][1]);
}
}
}
work(1, 1, c);
dp[x][0] = pl[1].pos(dt - 1);
dp[x][1] = pl[1].pos(dt);
dp[x][2] = pl[1].pos(dt + 1);
if(d)
dp[x][2] = 0;
else
dp[x][0] = 0;
}
int main()
{
prep(19);
int i, u, v;
scanf("%d", &n);
scanf("%s", s + 1);
for(i = 1; i < n; i++)
{
scanf("%d%d", &u, &v);
e[u].emplace_back(make_pair(v, 0));
e[v].emplace_back(make_pair(u, 1));
}
dfs(1, 0, 0);
printf("%d\n", dp[1][1]);
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 14ms
memory: 38688kb
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: 10ms
memory: 39196kb
input:
4 SFFF 1 2 1 3 1 4
output:
4
result:
ok 1 number(s): "4"
Test #3:
score: 0
Accepted
time: 3ms
memory: 38208kb
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: 7ms
memory: 38168kb
input:
2 FS 1 2
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 11ms
memory: 38396kb
input:
3 FFF 3 1 3 2
output:
1
result:
ok 1 number(s): "1"
Test #6:
score: 0
Accepted
time: 5ms
memory: 37252kb
input:
4 FFFF 1 2 4 2 2 3
output:
1
result:
ok 1 number(s): "1"
Test #7:
score: 0
Accepted
time: 7ms
memory: 37956kb
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: 7ms
memory: 38960kb
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
Runtime Error
input:
199995 FSSFFFSSSFSFFSSSFSSSSSFSFSSSFSFFSSFSFSFFFSSSFSSFSFFSFFFFSSFFSSSFFSFSFFFFFFFFFFFFFSSSFSSFFFSSSFSFSSSFFFSFFSFSSSSFSFSFSFSSFFSFSFFSFFSSFSSSFSFFSSSFFSFFFSFFSFSFSFSFSSSFSSSSFFSSFFFFFSFSSSFFSSSSSSSSFFFSFSFFSSSFSFFFFFSFFFFSSSSSSSFFFSFFSFSSSFSFSFFFFSFSSFSSFFFSSFFFSSFSFFFSSSFSFSSFFSFSFFSFFSSFSFSSSSFFF...