Homework New

This commit is contained in:
e2hang
2025-11-27 13:40:37 +08:00
parent b84c3ba783
commit 4965074539
39 changed files with 2191 additions and 832 deletions

View File

@@ -1,39 +1,79 @@
use std::io;
use std::io::{self, BufRead};
pub struct Status{
pos: i32,
a: char, // from
b: char, // to
c: char // aux
fn next(s: &Vec<char>, start: usize, end: usize) -> Vec<usize> {
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 mut s = String::new();
io::stdin().read_line(&mut s).unwrap();
let n: i32 = s.trim().parse().unwrap();
let stdin = io::stdin();
for line in stdin.lock().lines() {
let s = line.unwrap();
if s.trim().is_empty() { continue; }
let mut stack: Vec<Status> = Vec::new();
stack.push(Status{pos: n, a: 'A', b: 'C', c: 'B'});
let mut max = 0;
let c: Vec<char> = s.trim().chars().collect();
let n = c.len();
let mut nxt = next(&c, 0, c.len());
let mut plen = -1;
let mut output = String::new(); //输出,要不然太慢总会超时
while !stack.is_empty() {
if stack.len() > max {
max = stack.len();
//计算P的话可以直接用最长后缀算使用KMP
for len in (1..n).rev() {
let mode: Vec<char> = c[n - len..n].to_vec();
let tmp: Vec<usize> = 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;
}
let mut end = stack.pop().unwrap();
if end.pos == 1 {
output.push_str(&format!("Move disk from {} to {}\n", end.a, end.b));
} else {
stack.push(Status{pos: end.pos - 1, a: end.c, b: end.b, c: end.a});
stack.push(Status{pos: 1, a: end.a, b: end.b, c: end.c});
stack.push(Status{pos: end.pos - 1, a: end.a, b: end.c, c: end.b});
if plen > 0 {
break;
}
}
print!("{}", output);
println!("{}", max);
//计算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);
}
}