From a57e06c3dd1a01d00dfd016ae900ba861b39b2e8 Mon Sep 17 00:00:00 2001 From: Andrei Ovcharenko Date: Fri, 31 Jul 2026 17:39:23 +0300 Subject: [PATCH] Validate sprint8 CLI input --- src/main/java/algorithms/sprint8/Crib.java | 32 ++++++++- .../java/algorithms/sprint8/PackedPrefix.java | 65 ++++++++++++++++++- 2 files changed, 94 insertions(+), 3 deletions(-) diff --git a/src/main/java/algorithms/sprint8/Crib.java b/src/main/java/algorithms/sprint8/Crib.java index 18d15d2..c8f665b 100644 --- a/src/main/java/algorithms/sprint8/Crib.java +++ b/src/main/java/algorithms/sprint8/Crib.java @@ -35,12 +35,22 @@ public class Crib { static boolean solve(String text, String[] words) { - int totalLength = 0; + if (!isLowercaseWord(text)) { + return false; + } + + long totalLength = 0; for (String word : words) { + if (!isLowercaseWord(word)) { + return false; + } totalLength += word.length(); + if (totalLength >= Integer.MAX_VALUE) { + return false; + } } - Trie trie = new Trie(totalLength + 1); + Trie trie = new Trie((int) totalLength + 1); for (String word : words) { trie.add(word); } @@ -76,6 +86,17 @@ static boolean solve(String text, String[] words) { return dp[chars.length]; } + private static boolean isLowercaseWord(String word) { + for (int i = 0; i < word.length(); i++) { + char current = word.charAt(i); + if (current < 'a' || current > 'z') { + return false; + } + } + + return true; + } + static final class Trie { final int[][] next; final boolean[] terminal; @@ -207,6 +228,13 @@ private static void run() throws Exception { String text = in.next(); int n = in.nextInt(); + if (n < 0) { + out.writeString("NO"); + out.writeByte('\n'); + out.flush(); + return; + } + String[] words = new String[n]; for (int i = 0; i < n; i++) { diff --git a/src/main/java/algorithms/sprint8/PackedPrefix.java b/src/main/java/algorithms/sprint8/PackedPrefix.java index 66c2420..859ab05 100644 --- a/src/main/java/algorithms/sprint8/PackedPrefix.java +++ b/src/main/java/algorithms/sprint8/PackedPrefix.java @@ -40,6 +40,10 @@ public class PackedPrefix { private static final int MAX_UNPACKED_LENGTH = 100_000; static String solve(String[] packedStrings) { + if (packedStrings.length == 0 || !isValidPacked(packedStrings[0])) { + return ""; + } + String first = decodePrefix(packedStrings[0], MAX_UNPACKED_LENGTH); int prefixLength = first.length(); @@ -47,6 +51,9 @@ static String solve(String[] packedStrings) { if (prefixLength == 0) { break; } + if (!isValidPacked(packedStrings[i])) { + return ""; + } prefixLength = commonPrefixWithPacked(packedStrings[i], first, prefixLength); } @@ -234,6 +241,45 @@ private static int[] buildMatchingBrackets(String packed) { return matchingBracket; } + private static boolean isValidPacked(String packed) { + int top = 0; + + for (int i = 0; i < packed.length(); i++) { + char current = packed.charAt(i); + + if (current >= 'a' && current <= 'z') { + continue; + } + + if (current >= '0' && current <= '9') { + if (i + 1 >= packed.length() || packed.charAt(i + 1) != '[') { + return false; + } + continue; + } + + if (current == '[') { + if (i == 0 || packed.charAt(i - 1) < '0' || packed.charAt(i - 1) > '9') { + return false; + } + top++; + continue; + } + + if (current == ']') { + if (top == 0) { + return false; + } + top--; + continue; + } + + return false; + } + + return top == 0; + } + // -------------------- FAST INPUT -------------------- static final class FastIn { private final InputStream in; @@ -357,7 +403,20 @@ private static void run() throws Exception { FastOut out = new FastOut(System.out); int n = in.nextInt(); - String first = decodePrefix(in.next(), MAX_UNPACKED_LENGTH); + if (n <= 0) { + out.writeByte('\n'); + out.flush(); + return; + } + + String packedFirst = in.next(); + if (!isValidPacked(packedFirst)) { + out.writeByte('\n'); + out.flush(); + return; + } + + String first = decodePrefix(packedFirst, MAX_UNPACKED_LENGTH); int prefixLength = first.length(); for (int i = 1; i < n; i++) { @@ -366,6 +425,10 @@ private static void run() throws Exception { } String packed = in.next(); + if (!isValidPacked(packed)) { + prefixLength = 0; + break; + } prefixLength = commonPrefixWithPacked(packed, first, prefixLength); }