1 条题解

  • 0
    @ 2026-6-17 15:03:11

    思路

    首先一个浅显易得的结论,当 AA 或 BB 连续出现时,我们可以将它们分成两段,每段都可以看作一个独立事件,结果数只和每个独立事件的样本点有关。

    我们设独立事件共有 tottot 个,每个独立事件的样本点为 wiw_i,则显然有 ans=∏i=1totwians=\prod_{i=1}^{tot} w_i。

    接下来该找 wiw_i 的值了。先打表找规律,发现 ABA 和 ABAB 的种类数均为 2,ABABA 和 ABABAB 的种类数均为 3。浅推一下,可以得到一个由 AA 和 BB 交替出现总计长度为 nn 的串的全部样本点为 ⌈n2⌉\lceil {\frac{n}{2}} \rceil,那么答案也就呼之欲出了。

    实现要点

    定义一个变量 flagflag 用来记录上一个出现的字符以判断是否到达两个独立事件的边界。

    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
    上传者