https://codeforces.com/contest/1238
D. AB-string
每个字符都属于至少一个回文串的字符串是好字符串。问一个仅含 A
和 B
两种字符的字符串里有多少个子串是好字符串。
导致字符串不好的字符只能在字符串的两端;假设是因为开头的 A
,那么第二个字符一定是 B
,进而之后的所有字符都是 B
,否则开头的 A
就在一个 AB+A
形状的回文串里。所以,坏字符串的格式是 AB+
、BA+
、+AB
、+BA
。
统计坏字符串不难,只要正反两次,在每个相邻不相等的字符处做统计即可。注意 AB
和 BA
会被正反都统计到,记得要适当的补偿。
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);
}