use std::io::{self, BufRead}; fn next(s: &Vec, start: usize, end: usize) -> Vec { let n = end - start; let mut nxt = vec![0; n]; let mut j = 0; for i in 1..n { while j > 0 && s[start + i] != s[start + j] { j = nxt[j - 1]; } if s[start + i] == s[start + j] { j += 1; } nxt[i] = j; } nxt } fn main(){ let stdin = io::stdin(); for line in stdin.lock().lines() { let s = line.unwrap(); if s.trim().is_empty() { continue; } let c: Vec = s.trim().chars().collect(); let n = c.len(); let mut nxt = next(&c, 0, c.len()); let mut plen = -1; //计算P的话可以直接用最长后缀算,使用KMP for len in (1..n).rev() { let mode: Vec = c[n - len..n].to_vec(); let tmp: Vec = next(&mode, 0, mode.len()); let mut i = 0; let mut j = 0; while i < n - 1 { while j > 0 && c[i] != mode[j] { j = tmp[j - 1]; } if c[i] == mode[j] { j += 1; } if j == mode.len() { plen = mode.len() as i32; break; } if plen > 0 { break; } i += 1; } if plen > 0 { break; } } //计算Q,用len1和len2,如果2 * qlen > len(s),则len(Q) = 0 let mut qlen = 0; if nxt[n - 1] > 0 { qlen = nxt[nxt[n - 1] - 1]; } if 2 * qlen > n { qlen = 0; } else { qlen = n - 2 * qlen; } if plen < 0 { plen = 0; } let out = qlen as i32 + plen as i32; println!("{}", out); //println!("qlen: {}", qlen); //println!("plen: {}", plen); } }