#[allow(unused_macros)] macro_rules! debug { ($($a:expr),*) => { #[cfg(debug_assertions)] writeln!(&mut std::io::stderr(), concat!("[DEBUG] ", $(stringify!($a), "={:?} "),*), $($a),*); } } #[allow(unused_imports)] use std::cmp::{min, max}; #[allow(unused_imports)] use std::io::{stdout, stdin, BufWriter, Write}; fn main() { let out = std::io::stdout(); let mut out = BufWriter::new(out.lock()); macro_rules! puts { ($($format:tt)*) => (write!(out,$($format)*).unwrap()); } let stdin = std::io::stdin(); let mut sc = Scanner { reader: stdin.lock() }; let c:Vec = sc.chars(); let n = c.len(); let mut acm = vec![0; n+1]; let mut cnt = 0; for i in 0..n { if c[i] == 'w' { cnt += 1; } acm[i+1] = cnt; } let mut ans = 0usize; for i in 0..n { if c[i] == 'c' { let w = acm[n] - acm[i]; ans += w*(w-1)/2; } } puts!("{}\n", ans); } pub struct Scanner { reader: R, } impl Scanner { pub fn read(&mut self) -> T { use std::io::Read; let buf: String = self .reader .by_ref() .bytes() .map(|b| b.unwrap() as char) .skip_while(|c| c.is_whitespace()) .take_while(|c| !c.is_whitespace()) .collect(); buf.parse::().ok().expect("Parse error.") } pub fn read_vec(&mut self, n: usize) -> Vec { (0..n).map(|_| self.read()).collect() } pub fn chars(&mut self) -> Vec { self.read::().chars().collect() } }