【思维构造】Make it Alternating—CF1879C

Make it Alternating—CF1879C
参考文章

  • edu场果然不一般。
  • 第二题并不难,但我居然写了40分钟,确实比较难想。虽然是900的题。。。
  • 第三题我没有做出来,有两个原因。第一个是我不知道怎么想的居然用了一个fact阶乘数组,其实那个地方直接乘r - i + 1就行了;第二个是我没有注意到操作顺序的不同也算是两种操作,所以删除的字符如果删除的顺序不同也是两种不同的操作。

C o d e Code Code

#include 
#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;
}

我的博客园:【思维构造】Make it Alternating—CF1879C

你可能感兴趣的:(思维构造,c++)