Submission #1161423

#TimeUsernameProblemLanguageResultExecution timeMemory
1161423browhattType Printer (IOI08_printer)Pypy 3
30 / 100
1104 ms327680 KiB
def get_operations(prev, curr): """Calculate operations needed to transform prev to curr""" i = 0 min_len = min(len(prev), len(curr)) # Find common prefix length while i < min_len and prev[i] == curr[i]: i += 1 # Calculate operations backspace = len(prev) - i additions = len(curr) - i return backspace + additions + 1 # +1 for print operation def get_operation_sequence(prev, curr): """Get actual sequence of operations""" ops = [] i = 0 min_len = min(len(prev), len(curr)) # Find common prefix length while i < min_len and prev[i] == curr[i]: i += 1 # Add backspace operations ops.extend(['-'] * (len(prev) - i)) # Add new characters ops.extend(list(curr[i:])) # Add print operation ops.append('P') return ops def solve(words): n = len(words) if n == 1: return list(words[0]) + ['P'] # Create adjacency matrix of operation costs costs = [[0] * n for _ in range(n)] for i in range(n): for j in range(n): if i != j: costs[i][j] = get_operations(words[i], words[j]) # Initialize dp table for TSP-like approach dp = {} def find_min_cost(mask, pos): if mask == (1 << n) - 1: # All words printed return 0 state = (mask, pos) if state in dp: return dp[state] min_cost = float('inf') for next_pos in range(n): if not (mask & (1 << next_pos)): cost = (len(words[next_pos]) + 1) if pos == -1 else costs[pos][next_pos] total = cost + find_min_cost(mask | (1 << next_pos), next_pos) min_cost = min(min_cost, total) dp[state] = min_cost return min_cost # Find optimal path def reconstruct_path(): path = [] mask = 0 pos = -1 while mask != (1 << n) - 1: next_best = -1 min_remaining = float('inf') for next_pos in range(n): if not (mask & (1 << next_pos)): cost = (len(words[next_pos]) + 1) if pos == -1 else costs[pos][next_pos] remaining = find_min_cost(mask | (1 << next_pos), next_pos) if cost + remaining < min_remaining: min_remaining = cost + remaining next_best = next_pos # Add operations for this word curr = "" if pos == -1 else words[pos] path.extend(get_operation_sequence(curr, words[next_best])) mask |= (1 << next_best) pos = next_best return path # Find minimum cost first find_min_cost(0, -1) # Reconstruct the path return reconstruct_path() # Read input n = int(input()) words = [input().strip() for _ in range(n)] # Get solution operations = solve(words) # Print output print(len(operations)) for op in operations: print(op)

Compilation message (stdout)

Compiling 'printer.py'...

=======
  adding: __main__.pyc (deflated 46%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...