求助

P2646 数数zzy

你的 k 和 t 有什么区别吗?
by zenglu @ 2022-07-06 17:28:50


好像计数有错吧。$z$和$y$都可以重复用的。
by sleepy_coconut_sheep @ 2022-07-06 18:16:29


而且应该会超时吧
by sleepy_coconut_sheep @ 2022-07-06 18:20:01


@[Orange1015](/user/565378) 首先,我理解dfs(k,t)表示s匹配到了t,f匹配到了k,所以应该是$f[k]$,而不是$f[t]$ 第13行有问题 > if(s[i]!=f[t]) continue; 其次,这个方法是$O(n^3)$的,应该过不了所有数据。
by barbatoss @ 2022-07-06 18:21:37


个人认为可以记下 $z$ 的数量,遇到 $y$ 时加上前面 $z$ 的组合数目。~~我先去试一试(逃~~
by sleepy_coconut_sheep @ 2022-07-06 18:23:17


@[barbatoss](/user/104155) Orz
by sleepy_coconut_sheep @ 2022-07-06 18:24:01


@[Fat_Panda](/user/623442) 这个是最好写的方法,应该是对的,我想到的是$dp$,$f_{i,0/1/2}$表示,s匹配到前$i$个,分别匹配了"z","zz","zzy"的数量
by barbatoss @ 2022-07-06 18:26:08


```cpp #include<cstdio> using namespace std; long long ans, t; char ch; signed main() { while (scanf (" %c", &ch) != EOF) if (ch == 'z') t++; else if (ch == 'y') ans += t * (t - 1) / 2; printf ("%lld", ans); return 0; } ```
by sleepy_coconut_sheep @ 2022-07-06 18:27:38


@[barbatoss](/user/104155) 应该也可以吧。~~我试试~~
by sleepy_coconut_sheep @ 2022-07-06 18:29:39


```cpp #include<cstring> #include<cstdio> using namespace std; const int N = 1e6 + 5; char s[N]; long long f[3]; signed main() { scanf ("%s", s); int len = strlen(s); for (int i = 0;i < len; i++) if (s[i] == 'z') { f[1] += f[0]; f[0]++; } else if (s[i] == 'y') f[2] += f[1]; printf ("%lld", f[2]); return 0; } ```
by sleepy_coconut_sheep @ 2022-07-06 18:34:27


| 下一页