那个随笔写不下了,先暂时放这
T1
由于电信技术的发展,人人都可以通过手机互相联系。
有一位电信大佬最近想生产一大批手机,然而从生产线上一台一台地生产实在太慢了,于是他想出了一个办法 —— 让手机自我复制。
于是他给手机加上了一个内置的函数 fork()。手机的程序如果调用这个函数,那么手机会生产出一台完全一模一样的手机(包括程序运行状态),并且自己这台的函数返回值为 \(1\) ,新手机的函数返回值为 \(0\) ,然后两台手机都继续执行程序。(请注意黑体字内容)
初始时,只有一台手机。接着,大佬让手机计算形如这样的表达式:- fork() <op> fork() <op> ... <op> fork()
复制代码 其中 是二元运算符,为 && 或者 || 中的一种。例如:- fork() && fork() || fork() && fork() && fork() || fork()
复制代码 两个运算都是左结合的,且 && 的优先级比 || 高,所以上面的那个表达式相当于:- ((fork() && fork()) || ((fork() && fork()) && fork())) || fork()
复制代码 对于表达式 \(a\) && \(b\),手机会先计算 a 的值,如果为 \(0\) 那么不计算 \(b\) 的值(因为很重要所以说两遍,请注意这里不计算 \(b\) 的值),该表达式值为 \(0\);否则计算 \(b\) 的值并将其值作为该表达式的值。
对于表达式 \(a\) || \(b\),手机会先计算 \(a\) 的值,如果为 \(1\) 那么不计算 \(b\) 的值(因为很重要所以说两遍,请注意这里不计算 \(b\) 的值),该表达式值为 \(1\);否则计算 \(b\) 的值并将其值作为该表达式的值。
表达式计算完成后,大佬制造出了数量惊人的手机,人类终于叩开了指数级工业制造的大门。
一万万年后,一位考古学家调查了此次事件。他得到了大佬让手机计算的表达式。他想知道大佬当年究竟制造出了多少台手机。(包括初始的那台手机)
你可以参照样例解释来更好地理解题意。
输入格式
第一行一个正整数 \(n\),表示表达式中的 \(fork()\) 的数量。
接下来一行 \(n−1\) 个用空格隔开的字符串,每个字符串为 "&&” 或者 “||”,依次表示表达式中对应位置的运算符。
输出格式
一行,一个整数表示制造出的手机的数量,你只用输出答案对 \(998244353\) 取模后的结果。
样例一
inputoutputexplanation
共生产 \(3\) 台手机,过程如下:
第 \(1\) 台手机开始计算 \(fork()\) && \(fork()\)。
第 \(1\) 台手机开始计算 \(fork()\),产生了第 \(2\) 台手机。
第 \(1\) 台和第 \(2\) 台的 \(fork()\) 计算完成,第 \(1\) 台返回 \(1\),第 \(2\) 台返回 \(0\) 。
第 \(1\) 台手机由于 \(fork()\) 返回值为 \(1\),开始计算 \(fork()\) && \(fork()\) 右边的 \(fork()\),产生了第 \(3\) 台手机。
第 \(2\) 台手机由于 \(fork()\) 返回值为 \(0\) ,于是 \(fork()\) && \(fork()\) 值为 \(0\)(跳过右边的 \(fork\) 的计算),程序结束。
第 \(1\) 台和第 \(3\) 台的 \(fork()\) 计算完成,第 \(1\) 台返回 \(1\),第 \(3\) 台返回 \(0\)。
第 \(1\) 台手机由于 \(fork()\) 返回值为 \(1\),于是 \(fork()\) && \(fork()\) 值为 \(1\),程序结束。
第 \(3\) 台手机由于 \(fork()\) 返回值为 \(0\),于是 \(fork()\) && \(fork()\) 值为 \(0\),程序结束。
样例二
inputoutput限制与约定: \(n \le 10^5\)
题解
因为 && 的优先级高于 || 就将 || 作为分割线,每一块 && 依次处理。
观察题目,如果是 && 那么前面是 \(0\) 就停止,如果是 || 那么前面是 1 就停止
只有当手机返回值为1时才能造出手机。而且在当前这块中复制出的手机,在下一块中才能造出其他的手机。
所以就引导出了答案等于块长的前缀乘加在一起。
接下来就是最简单的实现了:
[code]#include #define int long longusing namespace std;const int N = 1e5 + 10;const int mod = 998244353;int n;string str;int cont[N], cnt = 0, idx = 0;signed main(){ cin >> n; cnt = 1; for(int i = 1 ; i < n ; i ++ ) { cin >> str; if(str[0] == '|') cont[ ++ idx] = cnt, cnt = 1; else cnt ++ ; } cont[ ++ idx] = cnt; int now = 1, ans = 1; for(int i = 1 ; i > T; while(T -- ) { int a, b, c, d; cin >> a >> b >> c >> d; if(a == c || b == d) cout |