Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 30 additions & 2 deletions src/main/java/algorithms/sprint8/Crib.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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++) {
Expand Down
65 changes: 64 additions & 1 deletion src/main/java/algorithms/sprint8/PackedPrefix.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,20 @@ 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();

for (int i = 1; i < packedStrings.length; i++) {
if (prefixLength == 0) {
break;
}
if (!isValidPacked(packedStrings[i])) {
return "";
}
prefixLength = commonPrefixWithPacked(packedStrings[i], first, prefixLength);
}

Expand Down Expand Up @@ -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') {
Comment thread
krotname marked this conversation as resolved.
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--;
Comment thread
krotname marked this conversation as resolved.
continue;
}

return false;
}

return top == 0;
}

// -------------------- FAST INPUT --------------------
static final class FastIn {
private final InputStream in;
Expand Down Expand Up @@ -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++) {
Expand All @@ -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);
}

Expand Down
Loading