Codeforces #1238 Educational #74

https://codeforces.com/contest/1238

D. AB-string

每个字符都属于至少一个回文串的字符串是好字符串。问一个仅含 AB 两种字符的字符串里有多少个子串是好字符串。

导致字符串不好的字符只能在字符串的两端;假设是因为开头的 A,那么第二个字符一定是 B,进而之后的所有字符都是 B,否则开头的 A 就在一个 AB+A 形状的回文串里。所以,坏字符串的格式是 AB+BA++AB+BA

统计坏字符串不难,只要正反两次,在每个相邻不相等的字符处做统计即可。注意 ABBA 会被正反都统计到,记得要适当的补偿。

use std::io::{self, BufRead};

fn main() {
    let stdin = io::stdin();
    let mut lines = stdin
        .lock()
        .lines()
        .map(|l| l.expect("stdin line exhausted"));

    let n: usize = lines.next().and_then(|s| s.parse().ok()).expect("read n");
    let mut s: Vec<_> = lines.next().expect("read s").bytes().collect();
    assert_eq!(s.len(), n);

    let mut res = {
        let t = n as i64;
        t * (t - 1) / 2
    };
    for x in 0..2 {
        let mut cur = 1;
        for i in 1..n {
            if s[i] == s[i - 1] {
                cur += 1;
            } else {
                res -= cur - x;
                cur = 1;
            }
        }
        s.reverse();
    }

    println!("{}", res);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值