Homework New
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user