1 条题解
-
0
思路
首先一个浅显易得的结论,当 或 连续出现时,我们可以将它们分成两段,每段都可以看作一个独立事件,结果数只和每个独立事件的样本点有关。
我们设独立事件共有 个,每个独立事件的样本点为 ,则显然有 。
接下来该找 的值了。先打表找规律,发现
ABA和ABAB的种类数均为 2,ABABA和ABABAB的种类数均为 3。浅推一下,可以得到一个由 和 交替出现总计长度为 的串的全部样本点为 ,那么答案也就呼之欲出了。实现要点
定义一个变量 用来记录上一个出现的字符以判断是否到达两个独立事件的边界。
AtCoder 不能使用
cin>>s+1的操作,我们只能从下标为 0 开始输入。开
long long,防止爆int。code:
#include<bits/stdc++.h> using namespace std; #define ll long long const int N = 250005; const int mod = 1e9+7; int len, n, tot, w[N]; char ch[N]; bool flag; long long ans = 1; void Wsolve() { if (n & 1) n++; int res = n / 2; //手动向上取整 w[++tot] = res; } void slove() { scanf("%d", &len); cin >> ch; n = 1; if (ch[0] == 'A') flag = 1; else flag = 0; for (int i = 1; i < len; i++) if ((flag && ch[i] == 'B') || (!flag && ch[i] == 'A')) flag ^= 1, n++; else Wsolve(), n = 1; Wsolve();//最后可能有未截止的独立事件 for (int i = 1; i <= tot; i++) ans = ans * w[i] % mod; printf("%lld\n", ans); } int main() { freopen("ABA.in", "r", stdin); freopen("ABA.out", "w", stdout); int _ = 1; //cin >> _; while (_--) { slove(); } return 0; }
- 1
信息
- ID
- 180
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者