Make it Alternating—CF1879C
参考文章
- edu场果然不一般。
- 第二题并不难,但我居然写了40分钟,确实比较难想。虽然是900的题。。。
- 第三题我没有做出来,有两个原因。第一个是我不知道怎么想的居然用了一个fact阶乘数组,其实那个地方直接乘
r - i + 1
就行了;第二个是我没有注意到操作顺序的不同也算是两种操作,所以删除的字符如果删除的顺序不同也是两种不同的操作。
C o d e Code Code
#include <bits/stdc++.h>
#define int long long
#define sz(a) ((int)a.size())
#define all(a) a.begin(), a.end()
using namespace std;
using PII = pair<int, int>;
using i128 = __int128;
const int N = 2e5 + 10;
const int mod = 998244353;
int n;
void solve() {
string s; cin >> s;
n = sz(s);
s.insert(s.begin(), ' ');
int res1 = 0, res2 = 1;
for (int i = 1; i <= n; i ++) {
int r = i;
while (r < n && s[r + 1] == s[i]) r ++;
res1 += (r - i);
res2 = res2 * (r - i + 1) % mod;
i = r;
}
/*
也可以这样写:
for (int i = 1, r = i; i <= n; i = r, i ++) {
while (r < n && s[r + 1] == s[i]) r ++;
res1 += r - i;
res2 = res2 * (r - i + 1) % mod;
}
*/
for (int i = 1; i <= res1; i ++) {
res2 = res2 * i % mod;
}
cout << " ";
cout << res1 << ' ' << res2 << "\n";
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int T = 1;
cin >> T; cin.get();
while (T --) solve();
return 0;
}