diff --git a/hw_01/pom.xml b/hw_01/pom.xml
new file mode 100644
index 0000000..307b47f
--- /dev/null
+++ b/hw_01/pom.xml
@@ -0,0 +1,27 @@
+
+ 4.0.0
+
+ 1
+ hw_01
+ 0.0.1-SNAPSHOT
+ jar
+
+ hw_01
+ http://maven.apache.org
+
+
+ UTF-8
+ 1.8
+ 1.8
+
+
+
+
+ junit
+ junit
+ 3.8.1
+ test
+
+
+
diff --git a/hw_01/src/main/java/hw_01/Bor.java b/hw_01/src/main/java/hw_01/Bor.java
new file mode 100644
index 0000000..99997c9
--- /dev/null
+++ b/hw_01/src/main/java/hw_01/Bor.java
@@ -0,0 +1,107 @@
+package hw_01;
+
+public class Bor implements Trie {
+ final private Node bor;
+ private int size = 0;
+
+ public Bor() {
+ bor = new Node();
+ }
+
+ public boolean add(String element) {
+ if (contains(element)) {
+ return false;
+ }
+
+ Node p = bor;
+
+ p.nwords++;
+ for (int i = 0; i < element.length(); i++) {
+ int currIdx = arrNum(element.charAt(i));
+
+ if (p.lifes[currIdx] == null) {
+ p.lifes[currIdx] = new Node();
+ size++;
+ }
+ p = p.lifes[currIdx];
+ p.nwords++;
+ }
+
+ p.isTerminal = true;
+ return true;
+ }
+
+ public boolean contains(String element) {
+ Node p = bor;
+ for (int i = 0; i < element.length(); i++) {
+ int currIdx = arrNum(element.charAt(i));
+
+ if (p.lifes[currIdx] == null) {
+ return false;
+ }
+ p = p.lifes[currIdx];
+ }
+
+ return p.isTerminal;
+ }
+
+ public boolean remove(String element) {
+ if (!contains(element)) {
+ return false;
+ }
+
+ Node p = bor;
+ p.nwords--;
+ for (int i = 0; i < element.length(); i++) {
+ int currIdx = arrNum(element.charAt(i));
+
+ if (p.lifes[currIdx].nwords == 1) {
+ size -= element.length() - i;
+ p.lifes[currIdx] = null;
+ return true;
+ }
+ p = p.lifes[currIdx];
+ p.nwords--;
+ }
+
+ p.isTerminal = false;
+
+ return true;
+ }
+
+ public int size() {
+ return size;
+ }
+
+ public int howManyStartsWithPrefix(String prefix) {
+ Node p = bor;
+ for (int i = 0; i < prefix.length(); i++) {
+ int currIdx = arrNum(prefix.charAt(i));
+
+ if (p.lifes[currIdx] == null) {
+ return 0;
+ }
+ p = p.lifes[currIdx];
+ }
+
+ return p.nwords;
+ }
+
+ private int arrNum(char a) {
+ if ('a' <= a && a <= 'z') {
+ return a - 'a';
+ }
+
+ if ('A' <= a && a <= 'Z') {
+ return a - 'A' + 'z' - 'a' + 1;
+ }
+
+ return -1;
+ }
+
+ private class Node {
+ public boolean isTerminal;
+ public int nwords;
+ Node[] lifes = new Node[2*('z' - 'a' + 1)];
+ }
+}
diff --git a/hw_01/src/main/java/hw_01/Trie.java b/hw_01/src/main/java/hw_01/Trie.java
new file mode 100644
index 0000000..5c043b4
--- /dev/null
+++ b/hw_01/src/main/java/hw_01/Trie.java
@@ -0,0 +1,32 @@
+package hw_01;
+
+public interface Trie {
+
+ /**
+ * Expected complexity: O(|element|)
+ * @return true if this set did not already contain the specified
+ * element
+ */
+ boolean add(String element);
+
+ /**
+ * Expected complexity: O(|element|)
+ */
+ boolean contains(String element);
+
+ /**
+ * Expected complexity: O(|element|)
+ * @return true if this set contained the specified element
+ */
+ boolean remove(String element);
+
+ /**
+ * Expected complexity: O(1)
+ */
+ int size();
+
+ /**
+ * Expected complexity: O(|prefix|)
+ */
+ int howManyStartsWithPrefix(String prefix);
+}
diff --git a/hw_01/src/test/java/hw_01/TrieImplTest.java b/hw_01/src/test/java/hw_01/TrieImplTest.java
new file mode 100644
index 0000000..51f60cf
--- /dev/null
+++ b/hw_01/src/test/java/hw_01/TrieImplTest.java
@@ -0,0 +1,116 @@
+package hw_01;
+
+import junit.framework.TestCase;
+
+public class TrieImplTest extends TestCase {
+ private Bor b;
+
+ public void setUp() {
+ b = new Bor();
+ }
+
+ public void testAddSizeContains() {
+ assertFalse(b.contains("Hello"));
+ assertTrue(b.add("Hello"));
+ assertTrue(b.contains("Hello"));
+ assertEquals(5, b.size());
+ assertEquals(1, b.howManyStartsWithPrefix("Hell"));
+ }
+
+ public void testAddContainsPrefix() {
+ b.add("Hello");
+ assertFalse(b.contains("Hell"));
+ assertTrue(b.add("Hell"));
+ assertTrue(b.contains("Hell"));
+ assertEquals(5, b.size());
+ assertEquals(2, b.howManyStartsWithPrefix("Hell"));
+ }
+
+ public void testAddOutstandingWord() {
+ b.add("Hello");
+ assertTrue(b.add("Head"));
+ assertEquals(7, b.size());
+ }
+
+ public void testRemovePrefix() {
+ b.add("Hello");
+ b.add("Hell");
+ assertFalse(b.remove("He"));
+ assertTrue(b.remove("Hell"));
+ assertEquals(5, b.size());
+ assertEquals(1, b.howManyStartsWithPrefix("Hell"));
+ }
+
+ public void testTemoveSuffix() {
+ b.add("Hello");
+ b.add("Hell");
+ assertTrue(b.remove("Hello"));
+ assertEquals(4, b.size());
+ }
+/*
+ public void testBorBigTest() {
+ //b = new Bor();
+ //Добавление
+ assertFalse(b.contains("Hello"));
+ assertTrue(b.add("Hello"));
+ assertTrue(b.contains("Hello"));
+ assertEquals(5, b.size());
+ assertFalse(b.add("Hello"));
+ assertEquals(5, b.size());
+ assertFalse(b.contains("Hell"));
+ assertTrue(b.add("Hell"));
+ assertTrue(b.contains("Hell"));
+ assertEquals(5, b.size());
+ assertFalse(b.add("Hell"));
+ assertEquals(5, b.size());
+ assertFalse(b.contains("Head"));
+ assertTrue(b.add("Head"));
+ assertTrue(b.contains("Head"));
+ assertEquals(7, b.size());
+ assertFalse(b.contains(""));
+ assertTrue(b.add(""));
+ assertTrue(b.contains(""));
+ assertEquals(7, b.size());
+
+ //Проверка префиксов
+ assertEquals(3, b.howManyStartsWithPrefix("H"));
+ assertEquals(4, b.howManyStartsWithPrefix(""));
+ assertEquals(1, b.howManyStartsWithPrefix("Hea"));
+ assertEquals(2, b.howManyStartsWithPrefix("Hell"));
+ assertEquals(0, b.howManyStartsWithPrefix("h"));
+
+ //Удаление
+ assertFalse(b.remove("h"));
+ assertFalse(b.remove("H"));
+ assertTrue(b.remove("Hell"));
+ assertFalse(b.remove("Hell"));
+ assertFalse(b.contains("Hell"));
+ assertEquals(7, b.size());
+ assertEquals(1, b.howManyStartsWithPrefix("Hell"));
+
+ assertTrue(b.remove(""));
+ assertFalse(b.remove(""));
+ assertEquals(7, b.size());
+ assertEquals(2, b.howManyStartsWithPrefix(""));
+
+ assertTrue(b.remove("Hello"));
+ assertFalse(b.remove("Hello"));
+ assertEquals(4, b.size());
+
+ assertTrue(b.contains("Head"));
+ assertTrue(b.add("HeadZzZ"));
+ assertEquals(7, b.size());
+ assertEquals(2, b.howManyStartsWithPrefix("Head"));
+ assertEquals(1, b.howManyStartsWithPrefix("HeadZzZ"));
+ assertFalse(b.remove("HeadZ"));
+ assertTrue(b.remove("HeadZzZ"));
+ assertEquals(4, b.size());
+ assertEquals(1, b.howManyStartsWithPrefix("Head"));
+ assertEquals(1, b.howManyStartsWithPrefix(""));
+ assertEquals(0, b.howManyStartsWithPrefix("HeadZ"));
+
+ assertTrue(b.remove("Head"));
+ assertEquals(0, b.size());
+ }
+*/
+}