diff --git a/CourseApp.Tests/Module2/BubbleSortTest.cs b/CourseApp.Tests/Module2/BubbleSortTest.cs index c57df84..20a3dfa 100644 --- a/CourseApp.Tests/Module2/BubbleSortTest.cs +++ b/CourseApp.Tests/Module2/BubbleSortTest.cs @@ -1,4 +1,4 @@ -namespace CourseApp.Tests.Module2 +namespace CourseApp.Tests.Module2 { using System; using System.Collections.Generic; @@ -17,7 +17,8 @@ 3 2 4 1 3 2 1 4 2 3 1 4 2 1 3 4 -1 2 3 4"; +1 2 3 4 +"; public void Dispose() { @@ -42,10 +43,8 @@ public void Test1(string input, string expected) BubbleSort.BubbleSortMethod(); // assert - var output = stringWriter.ToString().Split(Environment.NewLine, StringSplitOptions.RemoveEmptyEntries); - var result = string.Join(Environment.NewLine, output); - - Assert.Equal($"{expected}", result); + var output = stringWriter.ToString(); + Assert.Equal($"{expected}", output); } } } diff --git a/CourseApp.Tests/Module3/RabinCarpTest.cs b/CourseApp.Tests/Module3/RabinCarpTest.cs new file mode 100644 index 0000000..2bb7010 --- /dev/null +++ b/CourseApp.Tests/Module3/RabinCarpTest.cs @@ -0,0 +1,86 @@ +namespace CourseApp.Tests.Module3 +{ + using System; + using System.Collections.Generic; + using System.IO; + using CourseApp.Module3; + using Xunit; + + [Collection("Sequential")] + public class RabinCarpTest : IDisposable + { + private const string Inp1 = @"ababbababa +aba +"; + + private const string Out1 = @"0 5 7 +"; + + private const string Inp2 = @"bcbbbabaacbbccabbabbacabaababacbbcaacababbaaacccaccbcabaaabbabaaacaaabbbcacbbbaccabbcacabbabaabacbbbccacacbcbabcacacccccbabcaaccabacbacbcbbacaccabbacabcaccabaccaaabacaacbacabcabcaababbcbcbbbacbabaacbaccccbaacbabaacbcabcbacaccbccbcaaababaabacbacccbcabaabcccaabcaccabacaacbbccbbacabcaaabbabbcccabbcbaabbbccabacaaaacacbbccbbcaaaabbbbaaccccbbacccbcbacacbacbbcabaabccbbbacacbbcabcacabccbacacbababccbbbbbccccbababbcacaccababcbaaabbbbbbacbcbaaccbcbabcaaaabbbbaccaacaacbbbcaacacaabbcbbabbbacababaabaaacbbbabbcbbbbbaccabbbcbaaabbcccbaacaaacbbbbacbccacabcbccbccaccbcccabacbbaacccbbabaaccbbbaaaabcaabacbacacacabccccbbcbabccbaabcccaaacabbcaaabbcaaacaabcbbaabbccbbabccacaacbabbcbbaccabccccaaaacccacbbccbcbaaacaaabbababcbbbcbcbbcbcbccacaabacbbaacccacacaaccbaaabccaabcabbacbbacaacacbbcaaabcabbbacaaaaabccaabbaacbcccbbbacabcaaacacbbbbacabcabcbcbaabababbcabaabcaabaabbcbbabbcabbccacaabcaacaaabacccbaaabccbabbccbbbacbbcacbbccbbccbacbccbbaaaacbaacbcabbcaaacacbacbbccbbacbaaaacbbaabcabcccabcbcabccaacaaabccabcbcccacbacabcabcabcccbbaabbabaabcbcaabbbcabababaaaacabcbbaacaaabcbaabcacabbcbcbbcabcbcccbcabcbaaaccbbbbcaabbbcaaaabbaacbcbabaaabccbbacbcaaabbccccbcbacaccaaaaacccabccbbbbacabcabaaabaaaacccccabababcacabcccaabacbcaabbccbbbaabcbacbbbccbccbbbbaabcbacacbcbbbababacababbaaaabacaccbbcaabbbbacacbccaaacbcacbaaccabaacbbcacabcbccbaabbbaaacaabbcaacaaabacbbbbbbbbbaaacaacbacbbcaacccabbacacbacbbbbaabccbcbbbbcbcaacccbcbcabaabcbcbbcaabcabbbcacbabbaacaaccbbcbabaacbbcbbabacbcacbbaabaacabcccbcaccccbcccbacabbcabacbbaacbcccaaaaaabcbcbcabcacacacccabaccacabbabcbbaaaaccacabbcbbbcbccacbaabbcacbcabcaabccaccbaabcccbbcbbbbcccabbaccbaaabbcaaaaccbccaababaabbbcbccaaccccacabacbbaaabbbbcbcacbaccabbcbbcaabaaccbbcaabbaacaacbaabcbccbccabccbacbcbaccbccccbbbbcaaabacacacbaccaaaaccaaccabacacaababcaaccababccacbcccbbbbbcbcaaaccaabaabacccbcbbaaccccbacbbacacccaccccacaaabbcbaabaaccabbbbcbccaaaacccbabbaabbcccacccbabaaaccccaccbbaccbaaaccbcbcbbbbaacaabacacbbcabcaaccbbaacaccbabcaccaabbababaacbccbaaccbcbaabcbacbbbaabbabbccabcaabacbccaaccbabcacbbccaccababcbbacacbcbaccbcbabcaabbcbbababbbabbbccbcbcbbbabccaacabbabaaaabbbbbacbbcabcabccbcbcbcaabbbbcabcbbbcacbbcabbbacbabaaccbbacacbacaaaaacaacaacbabbbcacabcbbcaaaaabbcccbbcbbbcacabaaabacbbbccbbcbccccabbbabbbabcccaccaaabcacacaccbcaaaacababcaacaaabbbcaccacbaaccacccbabcbbabacabbbbcccbacaacacabaaaaacbbcabbaacaaccababbcacbbbccaaabcccacaabaaaccbcbabccbbbcccbbbaccaaacaabccacaabbccbacaabababaaaccbccbcaaaaabababcbbacbaaaabaaacbbcbbaaccbbbbaaacabcaaccabbcaccbcccbacaabacabbaccbacbaabcbcaaabbbcbcabbacaccabaabbbabcacbabccabaabbcbcacbbbbcbbbcaaabbbabaaccbbacabaaacbbabaaaccacacabcccccbbcbbbbbccabcbaaccccbbbaccababbbacbccccccbacacabcacbbbacbbacbccccbaabbbcacbacacbccbcabbbcacacacabaacaaaabccbcaacaababcbbaabccbccbabccbaabbcbbbaabcbababbcacbbcbbbbabcbabbcbcccababbaaaccabccbaaacbaccbbcbaaacccbbaaacaabcbbcbbcccbcbacacbcbbaabbaaacbbcababbaccabbbbbcaccbbbcccaaabbaabcccbbaaaacbcbabcaaccaacaaccaaabcbccbbbcabccbacbbccaabbaaccaccbcbbaaccbcabcacaacbacabbccaabbaacabcacabbcaacbbcaaaaaaacbaabbbacccaccbcbccccbbcbbcccacaaabbcacacbaabbbcaccacccbbcaacababcabbaabacbcaaccbccaabbabccbbccbacabbacbabaabbaabcccbbcbbaabbbcaccccaaacbcbbaaccaccbbabcabaababaaccccacabbbcacccaccabcbccbacaaababaacbbabaacccbbcacbcababacbccbccaacabccabacccbbcbacaacaccbabbaaaacbbaacacbabbccbaacacbaabaababbbaabbcbcacbccacbbbabacaccbccacbccacbbbcbbcaccaccbacabcabababbcccaaaababcaaacbccbbacccacabacbacccbababbbbbaccabacbbbcccbacbcbcccbaaaacbcbbbbaaccbcbababbcbabbacabaabbbaacbaacccccacbbaccbccbbbccbcaaaccbaabbcbabcacbbbaabacbbabcabbbbaabcaccabbcabbaccccccbcbccbacbccaabcbccaaabccbbaaacbbbbbbbaaaaaccccabacbbcabaacccabbcbcbccbbacaaccbacbbabcbbacbbbabcbcacaccbaaccbbcccabcbcccbacaabccaacacccabcabcaaccaabbbcaacbabbcbbbccacabbbabaaacaaacbaacabbbccaacacaaacacccabacbbaacacaccccacaabcbbaaaccaacaccccabbccabbabcabacabcaabccbcbaababccabccabacccccabbcacabccbbbacbbcacbaccacaaaabcccbbbcbaacbcabcbbbaacccbcbcacbcbababcabcabbcbcccbcbcccbababbcbbaccaabbbbabacaaccbccaababacbabcabaccacbcaabbbaabcacabbbacbcccacbccccaacbcbaaabcaaacabacbcaccbacbabacbaaacaabaabaccbcbbbbbcacbbbccbbccaaabbcababaabacbabcbcccccbbbbccbbbaacbaabbbaaabccabccbbbabcaaaaacbabbbcbcabbcabcccbbaccaaaaabbaaaacaacabbccabcabcbcbcaabaaacccabbacccbacccaaaacacccaaccbbabcaccaabbbccacabcbbaaacbbbbccbaacccbbbbcabaaabacbcaccabbaaccbabaabcabcbbcbcacaccbccbccaccbaccbacccbccabbbacaabccaabcbbcbccabbcccabbcbaccacbbbbcbbaabbbbabaabbbccabaccacaccabbccbcbcbabcaaaccaccabaccccbaaabbabccaabaaababaaacaabaacbcabacbcbabccbcbbbbaccccaccbacbbcacccaababcbbbcbbccaacacbbbaacabbcbbbbabbabcbbbbbbbcccbbbcbabaacacbccacbbbacabbbaacbccbaacbbccbbaaccbbcaabcccbbbbbcaacaccaccccaababcccaccabaaaccabccaccacaacacbbccbaaababaaabaabccaabaaccaabaccbbababababbcaaabcaacccccbabbcabbabccccaaaabacbacccbbabbbaacccbbcaaabbcbcaccaacbcccaaacbacabccaccbcaccacbabbbbbbbbbaabccccbcbccabacaaaacbabcccbbbacccacbbcbbbbacbccbaabcaababaccbaccabaacbacbacaacbaabaaaccbaaaaacaaabbacaccccccbcbbcaccccacccbccbccaccbaacaaabaccaccabaabbcaccbbacccababacbbacaaabbccaccbbbcbbaaabaccaabcbabababcbabcacaacbaaaabccccabccccacabacaaabbbabbcacccbbccccbbbaabbccbcccccbcaccbccaaaccaacbacbbacaacacbaabcbbaccbcccaacabbaaaaaaabcbcccacabcbcaabcaaaabaabcbaacccccabcacaccabbccacabbbaabccabbaaccbaabcacaaacbabbcacabccacbaaabcbaacacccabbbbbcaabcaccacbbaacbaacacbccbccccbacbccacabbbcccbababbacbcaccbcabbcaaccbbabbbaacaabbacbacbaabcccbcbbbbaacbbaccaaaaabaccaacccaacaaabbccacababcabaabcacbcbbcabbaabcbbabaacaabccccbbbccbbcbcabcaacbabbbcabbaaabbbbaccaaaaaacacccbbbcaabaabcacaccabacacccbbcaaccaabcccbbbbbbacaaaaacbcacbbacbccbaccbbcbbcbbcbbaabbaaababcabcccabcccbacacccbbbbccbbcaacbacbcbbbbccbbbabbacabcaaacbcabaccbaaaccbbbbbaacccaabacbabbaacacacaacbcbacbabbbbcabcbaccbbbbcbcaaacbbcabbbccbbbcabacbbacaaabcaacacacaaaccabababacbccbacbcbbbcbbcbbaacccbcccbbcacaabbabaabbccbccccbccacaaabaaaccabaccaaacbcacccaccabbaacbbbbabaccaabbbccccbbabcccbabcabaaabaaabbacbaaaacabcaaccacaaaccbcbababbccaacabbcbaacbcbcabaaccccbbbabbbbbaabbccbaababbabcbbbbbbbcaabbacccccbcaaacbcaacbbbbccacacbabcabacbccacbaacacbacaabaccbcacabcbcbbacbccbbbaaaacbccccbbcbaacbaababacbbbccbbccbcccbaccacbabcbabaabcccbbcabccbacacbaabbbaacaccaabcccacbcbbaccaababccbacccccabbbbbcbbbcbaccbbabbaccbbbbccbacbbcabbcbaccababcbcababcabbcbcbabcbbaaaabcbbbbcbacaaabccbcbaacccabacbbcbbcbcaaaacbcccbcbabbabbbcccbbccaccbccbabbaacabacbacacababbcbbbacabbabcacaacbbaccabaccccabbaacacabcbcccbaaabcacbabaabaabbaccbcabccabacbbbbcbabbcbbacabbccaacccbbcccbabccbccccbacaacccbcbbbabcaccacbccccbbaaacacabcaaccaacaaabcbcbacbcabcbabaccacbbaccbabcacccbacccabbcbcbcccabccbbaabbabccccbabacaccacbcacabcacabbcbbbbabcbcbcbbbcabcaccbbaaaaabbbbccccaaabbcbbabccbabaccbacbbcabbaacccbbcbacccbcbbcbaaabbccccabbbbabcacbaacaaacbbaabcbaacbbcababccacbbcacbacabbbbbaccabcacccbabacabccaccbcabbabccacbcabbaabcbcccbacacbbbccccbcacbbbacabbabbbabaacbabcacabaaccacbabcccbababcbcccbcbbbabacabbcbaccbcbbaaaacabbccaacbcbcabbacccabaacacccbbbacbaaaaabcabbcbbccbcccabaaabccaabaabcbcbbabbccaaccacbbaaabbbbbabacbaccbcbbbccacbabbacbbbbbbacabbbbbaabacbcbabbaaacabccbbacbcbbaaacbbaabcbacbabbcbaccaccaabbaabbbcbbcacbbbbacbaabbaaaacbaaaabaababacaaacbbbbbbccacaaacbbbacbcbcaaacaababbaccbaaaacccacbacbaaaabbcaccbcabbccbbcaaccbbbbbcccaccaccbcbacaaaaaabacccbcabaabaacaaacabaababccabacbbababaaccccbaacaccbcabacaabbccbcbbaabbcaaacaccbacbbabaccacabcbbbccaacbbaabaaacbcccaabacaccaaacccabbbccacccbcacabacccabccaaababbaccbabaabacbbccbccbccabbbbaabbbcaaaacaccbcbabaaaabcaacbacababcbababccbcbaabcbbaaccacbacbaacbabcacbaaacacaccbaccaabcbaabcbabaacbacccbccaaaacbaaaaabccbccccacbbbaccacbabaacbbacbbbccabcccbcbbbaabccccbaacaabbcabcbbbbbbbaaaacabccccbcbababbaacbccaccbbabacbcabbbbabbacacbbaaaaabbacbbacccbbaacbccbbccaabbbccccaccbaaccacbbaaababacabbcbcbabaaacbcabcaacbaabbaababbcaccaccaababbcccacaaaaaaabbabcababcabccaccababcaaacacbcabaccacbcbccacbcbcccbbacabbbbbcbbacaababacabacccaaccbabaaabbccbbaababbccbacabcaccacbaabbbbbcbaabcbcbcbaabcccbabbcbaccacbcbbcbccabbacbcacbcbbccccabcbcbaccccbcbacaababccbcbcccbccabccababacbabbacaaacaabcccbcaabcbbcabbacbbcbbcbcaccaccbcbaabbacbacbabbbacccaacabcaacbbcababacacaccbccabcccbcbcbaabbaaababcaabbabcabaabbaababcaacbaaabbbaaaacababbaccacaabbcbccbbccacbbabaabcbbbcbabcbabaaaacabbbbbbacababcccccbcbaaccbbacbbbbbbacacaabbababcbccaacccacccaaccccababccaaaacaacabbcbcabcccabaababcccaaaccabbbaccbcabcbccabccbbaaabbcabcacaabcacbcaacccbbbbbabaccbbccbabbcbcbacbcaccbbcbccabbcbcbcacbcababbcaabaabaaaccbcbbccaacacaccbaabbccbbacbacaaccaabaabcaabbaabcabbbbbabccabcabcabccbbaabcbaabcaabbbbccaacbababbabccabaccccaaaacabbabccbabccbbbaabbccacbbaaaacacbacabaaabbacbcabbbabaabbabcbbacbcacbbcbacacabbacbbbbbaccbbabbaacabaacabcabcabcbaccbbcbcbabcaaacacacccaacbbbcbbcabbacbacbaabbcabcaaacccabcbcbbbcabbaaabbcbaaabcccccbccbcaaabbbbabbcccaaabaaabbbaabccacccbbcaaabaccaaaaabbababcbbacccccccbabbcbcacccbcccccabcababbabccababbabbaabacbbcbbbbbababcaaccbababccbaacbcaccbcccbaabcabcabbacbaaaacaccbccbcacabaaccbccbbacccacbabaabbcaaaaaaabaacccaccbbaababbaabcaaabcbbcccbcabcbabbaabbabbabaaccaabacbacbccbbaccaccaaaaccacbbbabbabbcbbbcaccccaabacabbbbcabcbabcbcccaabcaccabcbbababcccaccbcaaaabbbaacbacbcbaaabbbbaabbcabccccaabbabccccaacbaabcaabaaacbbccbabbcbaaccabbcbbbbabbbcababcbacbbaaaabaabacbbccaabcbbacaacabbacacbcbaaabbabacbacbbaacccaacbababbcaccaacaabaccaabcbabbbaaacabaaaabbbcbbbcccaababbcabaaccbaacbacbccbccbacbbabacabacbbbaaaaaccccacbbacaacabccbcccbacabbabbbaaacbabbacbabaccccccbaaaaccbbbcbaccabcbbcacbcbbbccbbbaabcbcbaababbcbcccacaababbbbbabccbababcacabcacbacbcbaabbabcccabaccbaccbccbababbcaacbcaabacaabbcbcbaccabbccbcabaaaaccbccbcccccccabaabcbcbccccacaccabbbacccababababcccaccaccccccaccbbaaaacbcccccaccbcacbcccbbacbaabcbabcacbcabcbccbabacbbcabcbabcabcbbabacccccabbbacabbacccbababbcbacbabaacccbabbcbaaabbccaabcabaababccacccbaacbcabbababccaaabbccaccaacacacbacbccaaaaccacacbaacccaaababcbbccbaccaacbbcabcbabbbcbacabcbccbcbbbaacaabbbcabcccacbbbabacccbbacaaacbccbcaccbbbbcbbbcbbcaabbcabcccacacbbcbccbcbbcabcbaaabbcbabaacbaabbcacbbcbabcacccbcbcaccabaacccaaaacaabcaabbccbbbccbcaccbbbabcbaababbabbaacababcccbbaabaccaaaaacacbbabbacaabbbbbabbcbbcaabccabcabbbbcbaabbbcabacabcbaabcccbccacccccbccabbbcabbabbcbaccbcbbbcbacbabbcbaaaaaccbacbcbabbacaabcacbcacbabaabcabbbbbbcccccabcbaabbccabcbacaccbbbbacabbcacaccccabcacbcbcababcaabbbbccbccacabbccaabccbaacbbababaaaaaaababacccbabccacbaabbabaacbbaccaccbbaabacccabbccaacaababccbaacacabaccacbbbaccccacbbccbccaababaabaababbbbacaacccbbcccccaabbcbcbbaaacacacbbbabccabcacacaccabbaacbbabaabbcccbccaaabbabbaacacbccccaacccccaccccacabacbabacaaccacacccacaccaaabacbcccacacbbbccbcbbbccbccaacacababbaaccbcccbbcaacabcccccaccabacaaccacbababbcbcaacabaacbbcaaaabbacbabaccbbcbaaabbcaaccabacbbcbaacbaacccbbbcabcbaacbccbbbbbbbbaacabaaacacabccaaacbaacbbbbcabcacaacacbabaaccbccacaabaacbaaaaabcbacabbcbcbcaaacaaaccaaaacaacbcbbcbcccaaccaabcabcbaaacbacbbbacaaaacbcbaaacbbcacbbaaaabccabcabccccbcabcabcaacbcababacbcabbcbabaabccbcbababcbabccbaaacacaaaaacccbcaccbbacccbbbbbabbbbbabccabbabcacccbcbcbabbabbababbabbcbcacacacbacbbabacccbcbaaabababaabcaaacacccabcabcacaacaccbbaaaaaacaacabbabacbbcccabcababaacbbabaaccbcbcbacacbccbcbcaccacbbbbccbaccaacaababcacbbbccbcccaaccaccacacabbbbbbcacbbbcccaaaaaaacbcbbccbabbbbbabbabaaabcacbaaabcccbbabbbacacacabacbcbacaaaaccaaaabcabaacbcaaccbacaccaabcaaaabaacccbcbaccacccacaababacacbcbcbabbabccbccaabacaacbccbaacbccbbccabccbbaaccbcbacabaaacacababbbaabbabbabbabccabaababccabbcaacbcababababccaabccbcaacbbcbaacccbabaaaaabccabaaaababbaccbbcbbaccbbaccbcbbcbccacbcbcaccbccacaaaababccbacbcabcaaabbbbabcbccccbcbaaacbabcaabbcbcbacaacbcbbcbabcabcabacbccabaccbcccbbbbabaccbcaabbcaaaacccccbabcacccaccbaabbabbabbabcbcbacacabacaababaacbaccbbccccabaacbabacbbabcbbccbbaaaacaacccabbabbabaaaaabcaaabbbccbcaaacbababcacccbaaaaabcacbcbabcbacaaccababacaabbabbaabacccaaabcccabccccbbcbcaacaaaccacabaaccbcaabcbbccaabbbbacbcbcacaaaaccabcbbccbbbbbacbbcabbbabaabccbbacbbabbbccabacbbaacacaacababaabbccbbcbbaccacbcbabbcbbcbbbaacacabacaaaacccabcbbbccbcbbbbbcbbcacbbbbcbbcabcbbcbcbaacccababbccbcbbacccaabaccaabcbbbbacbbbaacaaccabcabacbbbbbbabbccbaaaaabbbcbccaabcaabaaacababbbcbbbaacabcbcbabaccbaaacacbabbaabaccabcaaccacacabaacbcbbbbbaaaaaaccbcbaaacabbaacacbababbabbccbacbaaacbbababcabacabbacbacbaabbbccaacbaacbaaccbcbaabbcbbbcbcaccacbccccbcaaabaaabcacbbccccbcabbccbccacabaabccabbcbbaaacababbabbbaccaabcccbbbbbbaabbcccabcbbbabccbcabaaaacbbabcbbccaacabcacbabbacccababacccbbcaaaacabccabcaaaacbcacababbccacccbcbcbbbbbabaaababcccaaccccccccbbbcacbcccababbabcaabbabbbaabacbbaaacccbaccbcbcaaaaaccbbccccbbbaaccabcabbbaacbcccacccaccacccbcbbcabaacaacccbacabcbaacabcbabccabccbbbaccabbcaacbaababcabbbacbbcabcaaaaacaccbcccaabbcccaaabccbcbabaaacccbaabbbbbbcbaaabbbcaabccaaaaaaababcacbabaaaaabcabaacabcaccacbcbcabaaccbabacbabaababcbcccbaababcbcbaabbcaabbcbccacbabccbbbcbbbbbcbcbccacbabacabacacacbcccbbcccaccbcbaacbcabcbabbacbcacabaacacccbaaaccbbbbcabbabbaaaaabcbbbccbcaccaaacbcaabaabacbbaacbaabccabaabababacbabcccbbbccccabcbcccccbcacaabbbaaccbbcabacccabcaaabccbabaaacbbaaabbbaacccccbbabcbababccaabbbbbaccabbacacaabaacbacaacbabbaabcacabcbaaacabaaccccbacccbcabaabcccaccaacbcbcbaacabbaababbbcbcaccbcccaacabbccabcbccabaacaabcbbcabcbcbbbbbbabbcbbacbacacccccaabaccaabbaabcaccbccaaacbaabbaccaacbbccbcaaacccaccbbcbaaccbbcbcaabcaacbacbbabcaaaccaccacaacaacaacbabbcbacbbcbababcccacabcacccbacbbaaaacbacaaabcbcbabcccccacbbcbcbcaaacbccaabaaccbbbcabcccccabaacacaaabbbcacbbcaccccbaacbbbbccbabcbccccabcccbacabaababbabbcbaabbaabaabacbaccccabbbbbcaaabbacaacbcaaacacccbaaacacbbcccbbccbcbcaabbbbbcbaacbcaabbbaababccbbabababcabcbcabaababbbbbcbaacccbabbaabbaabbacaaabccacacaabaaabaccabbacbaabcbbcbaabbccbcccbaaabbcbcaaaabbcccbaccacabbcccbabbabcaaabcbacbccaabbbacacbbabbbacabababcabcaacbbcbcbaababacacccbbbccbcbccbacaaabbccaabbcacbacccccccbaabacbbbbbabcaaabbabacacbaabbbbcccacbbbcaaabbabacaabaacbcbabcaaaccabbbcbcaccbbbabcbbabcabbccbacbaabbaccbcaacabcbbaababbbacbbcabaacbaacacaaacbbccccacbabbbcaabaacabbaccbabcbaacccbbbaaabaacaaabbbbcccbbbbbbcabccaabcaaaccbaaaaaacccbaccabbabbbabcccbbcccbabccabcbbccabbacbbaaccbbacbbaacaaaccbacbaababccaabbcbbbacabcccababcbbbaabcbbabacbcccaabcbaabcbbaccbbabccbbcbbccaababacacccbbabbacabbabaaccbbacbcbcbbcccbcacccbaacccbbbbaccabccaccbccbbbcbbabbbcbabbbbcaaaccbacacbaabcbcbcccbcaccccacacccccaccbaabbbaccbbababcaccbcaaacbbabccbabaacabccbabccacaabcaccccbbbbabbaacabcbacccbcacbbaabacaababbcabacbccaccbcbaccbbcbcbabccaabcbbabbabaaccbbaccaaaaccbbcbabacccccacbcaababacbababbbcbababbbabcbbacbccccacaabbcabcccbbaacbcbacacabbbbcccbcabbaabbbbabacbbcabbbbccaaccbbbbcabcaaabaabbbccbbccbacccbabccbaaaaacaaabaaabbababccbbbabcccbccccaaaaaaccabcaabacbbaacaacbbbabbaabbaaaccbbcaaaaababcabaabccbabbccabaaccbacbbbcbbacbacbabbaccaaaaccccaaaccbcbabbbcbbccbbaaababacaababababbccacbaccbcacbccbacacabcaacbcccccbabababcabaacbcabbbbbaabbbacabbbbbcaabcaababbccccbbbacacaacccbcaaccabcbbaacbbbccccbabcbbcbabbcabcbacabacabaccbbababccababaaccaabccbcbaccbbacabccbacbcacbbaaabaaaabcabcbbacaccbabbaccccbabaabaccbbcaabaacacaabbcaccccacacacbcbabbcbabbcaaccabcabcaacbccbcbaccacaacaabbacbcccabbbbbcaccacbbaaaaacaaaacacbabbaaabbbcabbaacacaacbccbacccccaaaabcccaccaaacaaacabcbaabbcbaababbabcbcbacabbcbccabcbccccbabaccccbcbcccacaaacbbabaaaacbcabcbbccabbcbabcbbbaacbaabccbccacccbaabaabbcaaaccccbcabcbccccaaacbaaabbcbbaabcaccccbbabaacccaabacabcbcaaabbbbbabccbcbccababaccbcabbccacabcaacaababbaababcbacaccaaabacccbababbccacbcbaaacccaaabcaccaacaaaacbccbcbccbbcacaacabbcaaaaabbaccbacbbccbaabbbcbbbabcbbacbaabbcaaaccbaaabcaacacbabbbbaaabcbcaccbaabbbcccccbbbcccbcbcbbaccacbabcacbacacbaccaccbcbbcbbcacccacccabbccbbccbbaaabcabbbbbaccbabaacccabcccaccbcacbabccbbbbbbccbbbacaacbbbbcbbbcbacbcacbacbacbabbabcbccbccabbbababccaaacbacababacacbabcbbccbcbccacacaaaabcbcacacacbcccbccccbcbbbabbbabcaccbbaaabaacaccacbcbabbabbbbcccacbbbabcbbabbbaacbcbaccabccaaaacccaaccbccccaaaababbcabbccccabccababbbabcabcbbccccaabaccaaaccabaccabacacbbababcaabacbcabbccaccbcbcbaaacacacccacccbaccccccbacbcabbaaaaabcabbacbaaaabbcaacbcaacbaaccbacacabbcccbbcaabbcbaaccabbcabcabccacccccbbccaccacabbaccacbbcaacbabcaacbcccbccacbabcaccbcbccaaccaccbcababbaaaccbabbcbccababbccbaacbaaccccbbabbaaacaccaaccaacccacbaaaccacbaaabbabababaabbaaabaaaabaabbcbbbcbabccbcbbcbbcbbbabbbccaaaabcbbaccaacaaaabbcabcbcaaaccacbbaabaccabbacbaabcabbbcaaccccaacbabaaaaccccccaabaaabbbabccbacccacabcccababaaaacbcabbacaaabcbacbccbbbbabccbbbcbabbababbbcbbbbabaabcaacabbbaaabacbabbccbcbcaccaacbccbbbbcbbcaaccabbbbcbccbbbccaaacaccbacbaccabcbcababbacbaaabaacbccbaaacccccccccbacaabbbcbcaabaacbbccbaaaabaaabcbbbbbbcabcaabcacabbabaccbaacbbacaaaacbabcaacbbbabcccbcaccaccabccccacbbaabbcbabcbacbbabbaacbcaaaaabbcbcbbbcaccaacbcbbcabbccbbbaacaabcbcbcacbacbaacbbbabcbbbbbababbbaacabbbcacabaaaccbbbaacaacacbacbbabbbaccabaacbabaacbacacbabcabbcacabacbbbbaccccbabbcabbcaacabcbccbbcabbcabbcaccccacbcaaaabbbabbcbaaaabbbbabbcaaaccbbaaaaaccbaccbacccabbcbcccabbaaacbabcaccabbccbbcacaabcbcacacaccccbccaaaccbabcaabbbbaaabacabcababccaccaaaaabccabcbbacabcbbbbcbcbbaabcaabbaccaacaacbabbabbbcacbcacbbacbacacacbbabccaacacccacbaabaaaacaababcbacccccccaabaccaaaaaabacababaabbaaaabacaabccbbcacbbaaaccacabcbccbbcbbbaaabbccbcbbcabccbaabbbcbbbbccbabacabaabacaccbcabcabacababbbaabcabcabcbcbbccbcbaabbcbbbbaabbcbccbaabababcccacbaaacaccccbaaaacbcaccbbabaaabbacaaccababacaaacbabaacbcbbabbaababbbcbabaaccbaaccacbcaccbbcbbbbbcbbaababccbaacababbacaccbcbaabacbcbbbaaccababbcbaccabcabbaccaccbababcbcaaaaacaaabbccaacbccabbcabbaacbaacabccabcaabaccbaccbcbcbacabbbacbcbccbcbbbaaccbbacaccbbbcaabbcabbccaaccbacaaacbbabccbcabaaccbccacccacacbcbabacbbcabbcbbacccccacacbbabaaacaaacacabaacbaacbcaccaabaabababccabbbbabccbbacbbbabaacabbabccccaaabcaabacaccbcabccabccabbbbbabbbccbccabcccbacbcbcbbaccacacccaacaaacabaccccababbbbbbbacccbabcccabbbcacabbaccbbcaccaaccccaccbaacccbbcbaccbabcbacababacbaccbccacacccaaabcbaacabacbbcaabbbaaabccbabbaaacbacaccabbcccbbbbaacbbbcbbbacbbcacccbbbaababcbaaaaabbabcaabbbaaabbaaabbbabbacacccbbccbcbcacbcbbcaabcabccbcaaccbcaaacbacbcbabbbcbbcccaabbacbaabcaacabaabbbaccbaabcababcbbacacbbaababacbbcbbaccbbccbaaabbaccabaaaaaccbcbaccaacaaccbccbbabbcaaabbaccbabbccccbbcbcbaacbbcbababacbabcccaccacbccabaaccacabcbcaacccaccacabbbabcbcbbbbacccbcbbbcabaaccaabaaaacaccbccacbcacabaabbcaaccbacacabaacbbbbcbabcabbaaaacaacbabaabbbabaaccbcaaacabcabccacbbbcbcabcabbccaacbacaabbccbcbcbbcacccabcbccbbbaccacbaabbbcacccabccbbacacaacbcacabcabccabbbbbabaacbaabacabaabccaaaacccbacccccacaccabbcbcbaccaababbaaacabcbbcbbbcbbaabbaaacbcbbaabcbbaccbbabcbcbcabcccbaaacaaccbaccaaacccbbcabbabcbcaabcabbabaaaccaacabaabbcbbbbbaaacaabacaaabbcacbcabbccccbcbbcbcbbcaabaaacaaacaacbababbaabaaacaabcbbabcbcbacbabcabbcbbaaabcbcccccaacaacabacbcacaccccabacbbaabbcccaccbbbccaccbccabccacbcaabaaaacbccabcbabaaccaabcaacbbbacbcbaaabcbabcaaaccbcaacaaacbaabaaaccabcabcbcacbbcaabccccbbbacbbaaaaacabcbacccbcaaaabbbcbbcbcbabccabcccaacccbacccaacccabacbccbbacccabbabacbacbbcacbaaaabbcbbaabbbacbcbbcbabbbbacbccabbcbbccbabbccbcccabccbacababccacbcbccaaaabcaacacbabbcbccbcbbcabbbbbbabbacbcbcbccabbccbaccaaabbbabcbaacbccabcaaabbabaccbaaabbbabcacccbacbbbcabbbcbbabcaabcbbcaacccbacccaabbcbabccacbbccacbacbabcaabbbcaaabbccbaacacbcaaaaaaaccabcabcccbaacabbcacccbbcacaaaccacabacbbaabacaaacccaaaabaaccaacbaaaacacaccabcbbbaacbbbcbcacaabaccaaaccaccacacaaabaabbbacabbaaacabcbabccaaaaccbacaccaccacbccababcbcbaaccbabcaacbccccaacaaabbccbabccaacccccbcbbcabaccbaacbcbcbcbacababaabcbaaccabbcacbaabaacaabababbbaccbacbaccacccbcbcbcabcbbbbbbacbbaabcaccbaacbbcccaababaacbccaaccaabcabaaabbaacbaccaacaabbacabbacccccccacbacaacabaabcabcbcacccbbbbcbacbcaaabacbaabccbbabbcbbccacaaabbbaccabaaababccbccabccbcacababcbbcbccbccabbacabccaabaaaacaaabbbbcaaaaccbcaabbbabaccbaaccaacbaaaabbcbccbabaaacababccbcbcbabaacbcbaccbbcbacbbbbaacbbabbcabaaaccbbbcababbbaaabababcbaccccacccccbbbbacaaaacaaacaabcbacbacbababbccbbabcbacbbbacbcbaccaaababcaaaccbbabcabbbacaccaaabcaabbabbabaccbccbbacbbcacbbccbbcaaababcacccaacaaaccbcbacbaccabcaccabccccaccbcabcbcacbbccbbcbccabcbaabccbabbbbabaacacacaabcccbaccabcbaccacabacacabccccaaaaaabcccabaabccaacbbccacabbbbcaababccbbacacbccbbaaacbbabcbacbaaabbbabbaacaaabbbbaaaacababbbbcacbbcacaabbcabbaabcbbacccbccbaaaacabababaccbaacabcbaabcbcacbbbcbabaacaaacccabbaabcbbccacacbbcabcabbcccaaaacccabbbaccacbcacabbaccccccabaccccbabbacaaaacababaaacabbcbbbcbcbabbaccbbcbbaaabccbbabccabcbbbbaabcaaaaccbcbcccbcacaccaabcaabbaccccacbaabaaaaaaacacabaccbccaacbabcacbbabcccbaaacccbacacbaccbcabcbbaaacbcbccbbbbbbcbaacbccaaabacbcacaccabcbcbacaacabbaccaccaccababcaccbcababcbabaaaaabbbbbbcabbcacaccbaccbabbbbacbcaacaccacbcbcacbcacbaabaccabbaacabcbacbcbabcbbccccabcbabaccbbbcaacbcbccbaabcbccbcbcccccacababbbaccbcabcabcccaccbbabccabacccabbbccacccacacbaaaacbbaabcbcbabcbbbcbabbacbcbccbcbbbabbbacccacbaccbbcbbbacbbaaaccbabbcbccbccbccaccabaaaaacbbbcaacbcacabababbcaabbcbbbacaccacbacbcacaabbabaacbccababaabbbacaaabcabbaacbcaacabbaccbabbbcbbcccbabbbbbabbcbacacaaccabaaaaccbcbbbbcbbacaacbcbacbbcaabbacacaccabbacbbacbbbaacbbbabccabbcbccbcacacbaabbacbbbbcaaabccbbaabbbcabaabbcbbabcbaaacccabccbabacbbcacacccbaccaabccabbabccbabcbbbbaccabacbaccbcbbaaababbcbcabbaaacccabcbcabccacabbccbccabbabbcabcbbcbabcabcbaccacabbcbbbbbcabcacabacbcacacbbbbaaabaccbaacccbbbcccabbaacacccaaccccaacccbaabbbacacacabcbcbacccabbbaacccbaaacacbccccaabbcabaccaabaacaacccbcaacbcabbbbccacbbabacaaccacabbcbabcabbaaaabaacbaabcaabccccacabbccbccababcccbccbabcbbaabaaaccacaaaaaccacccccbbaacbbabbbacacbbccabbaabaacccaabcccbcbaaaacccabbbabbaabcbccabcbbacaabacbabcabbaababcbbbbcaacbaabcbbbcbabcaacacbcacaacbcbacbabbabcabbaccacabbbabccacbccabbcbbccaccbabbbcbcacbcbaaacabcacbcaaaccbbbaaaabaaabbccbbbbcaccccabbbcababbabcbbabbbbcacccacccbabccabcabbcaabcbbaaaacbcabacacabbbcbbcacababcbbaaccbcbcbacaccbbccabccbcaccacbbaccbccaaabcaaacaabaacacccbaaccacbbabbaacbbbcbbcbaabaabcaacbabbcbcaccaccabaacbcacacabaabbbcbcbbbaaabcccbaacbaaababcaaabbbccbcbbbcccbbcabcccacaababcbcbbcbaacccabccccccbaacaaccaacbcccccaccbacabcbabccbbcbbbabccbbcbabacccabacabaabababccbabbbcaaabbbbcbbacbaacbcabbacbaccbcaabbcabcccaaaaaccacaacabaaabacbbaccccbcaabcccbbaabaaaaccccacabaccbbaaabcccabacbbcabcaaabcbcaacbabacccccbbcbacbaccacabaaacabaaaccaaccbbaaaaccbcccbcbbbaababcbabbacbacccbcaacaacccacbcbcbbbcccccaccbabcabbbaabcbbaccbabbbcbcababbcabcbacbcbbabbcbbccbabaaccbbabacbbbbcbabbabbccaacbcbbaaccbabbcbcbbccaaaccbaacbccabbbcacacacbbbbacbcacbaaababccaacabbcbccbbbbaabaabbccbbbbbbbaaabcbbbccaababbabbcaabcbbccbabcbaaabcaacbbbbbabccabbaaacbccbbcbcacccabbaabbccccabcaacbacacccbbccaabcbcbcccaabacbcabaccaabbbcbcaabaccbbacacbaccabacccbcaaacccabacbcabcbbccabccccbababcbaaabbaaccacacccabcaaccbbcccccabbcacaccccacccacbbcaabbbbcbbabbacacbcbaabbccccccabcbbcbccccbbbccbacbabaaacccacaaccbaacbaaccccacacaccababcbabbacccaccbbbcbccbccbccbbbabaccacacbbabaccababbcbcbbccaabacbcbaccbcbabbcbaacabbaacabbbbcacbccbabcccbabaaacbaaaccbbbabaacaaccaccbbcbcacacabcbaabbaccaaabbcccccbcacabcaacccacababcabcbccccbabbacaaacccccacbbcccbbababbcbbacaccccbbccbcacabacccbbbcaacccaaacabbabcaccbcccabcbabaabbcbaacbbabacbcaabbaaabbbbbaccaaacaaababccbabbcbaabbcbcccaaaabbaaababbcacccbcbbacaacbabbbaacbccaaabcbbbacbbcbcccccaccacbcacacbabaacbabbbaabbbbbabcbbbacaaabbacaaacabbbabaccbcccabcaacacbccbacacabaacacababbcbbabbbbbcaccbaabbbcbbbababbccbbcaaaccbacabaababaacccaccbcacbacaaabcccabbacccaacbacabcccbaaacbbbccccaaacabbcbbaccbaaabacaccacbbbbccbaacababccbabbacbbbccbccccaaaaaaabcbaaacabcbabccbabbababacbccbcbcbaaaababacccbcbbbcacaabccbbbababaaabcbcabbbbcbcbbcacbcabbaacaccbbbcbaccbcbcbaaacbaaabcbaaabbcbcbaacbacabbcabaaaacbabcaaaabaabbaabbaccacbacabcaaaabbccaabbbcbaccabaaaabcaaaabbacbbbcbaccaacccaaacabbabcbbcbaaaccbabbbabcabbcacbbcabbaaaacccabcccbbcbccababccabbbcaaaaababcbcbbcacbccacbbaccbbcaabcabccbacbcccbbcbcabcbacccacbbcaaaacbccccbabbcbbabaccbbcacacabbcbaccccbbcababcaccaccaabcacaaaacbcbbaabaaccacbbacabcacbcbccbbbcbaacacbcacbcbbabaabbaabccacbcabaaababccccbaccaaccaccabbbcbbbbabacacacbccbbcbbabbbbaacacbaccaacacbbbabccbcbbbcbbcbcbabbacbbcaaabcabababacbcccbcbccaaccbbaccbabcbbbaccabbbbcbcbacaabcaacbbacaabbbaacccacacbccbcaabaaabbbacaaabaccbbacbccaacaabccbcaaacbccbaacaccbcccaccaacbabbcbaaaaccbcaacbbaccbcaacbbcbacabaccabcbaacaabcbcbbcbacaaacaaaaabbbaaccbabcabcbbabbacacccbbbcbbabbcbcababccabbaabaabbccbcaaabaabcabbaabbbccabacbbbbcbabaacccbabcbbcbaabcaacccbcaccbbbabbacaabcabbabbaacbacbbcaaaacbacccbbcaabcbbbcbcabbbbcabacaababccaaccccababacccacaacccaacabbcccaccabcbabacbaccaabbabaaaacccaccccabaaabcbbbbcccbaccbcccbcccaaaababbbcaaacabcacacbcacbabcccccbabccacabababaaaacbacbccabacabbaaabacaaabcabbbbcaacbccaccccacbcababbcaccbacabcbbabbababccbbccccccbcbbcbcaaacaccaccacbcbbaabaabbbaacaccbcbcaccbbccacababbcbabcbbcbbcbccabccbabbaccbcabbaccaccaabcaccccccacacbbaccabaccbbbcbbbabbbacaababacaacbaccbcbcccbbaaccbcbccabccccaacabbbbabcaaacaaccbcbcaabbbbbccbccababcabbbbbbcbabbabbbccbccabaaccbacacbacccccbaccccbccaabcccbccabbabbacbcacabbccbccbaaabbcbbabbcaabcababacccbaacaccabbcaccbcaaabbcbbcabcbcabcacabaaccbacaaaaacbccacccccccacccaccabbbacccacbbabcbcabbcaccbbaabbababacababababbbcbabbcbcacaababaabaacbacacacacccaabcaccbcbbbccccacacaaacaccaccbaccbacacbbabcbcaaabcacccabccacabccabaabccabacbccaabaabaaaacbcabcaccacbbabcbcaccbbbccbabcacbccabcacccbababcacabcabacabcbcbabcabbacababababcacccbacccabaaacabbcabbaccbbbacccbabcccccbbbcacaccaaccaababcabbcacabcbcbcaababccbbcbaaaacbbccaabbbccaccbbcbcbcbacbaccbcaaacacbbccacccbbbccacaaaaccabaacaacbaacaaabaabcbcbbabaaaccaccbaaaabbabbabbbbabaabbbccaabcaccbbabbcbbbcabaccbaacacacbbbcbaccabacbaaabbbcaabacccccacabbbbbabababaccaacbaababccaababbaaccaccbbccbbbbaccbccbcbbbbbaabbbbaccbccacaccccaacacabbbaababbcbccbacbbaabaaabaacccbbcbbcaccababcbcbcbcbabcacbaabbcabaabbbabbabaaaccabcaccbcbcccbacbccbccccabaccbbabababbabbaabacabacbbcccbabcccacccccbacbacabbbbcbaacbbaaacacacbbccbccbbabbbccacacabcbbccaacbbbacaccbcccbbcbacbcbabacbccaabccbabcbbbbcbaaccccaccacbaabccbabbabbaabbccbcbccbbbccbaaabcbcbbaabccbacbbbbcccacbbabbaaabbbcbbccabbaaabccbabccbbbacccacccacccbbccaaaccabaaaabbccabbabcbbbccccaaacbbbaacbbbbacbbbcbbabbcabccaacaaacbaacbcaccaacaaabacbaacbcacaaabbbbbaabbcaacbbabcacbaababcbcbbbbacaabbabcacaccbccbbacacccaacbccaacaaacaaaabbbababaaacbacccccaacbcacabaaccbacbcaccbbccccaabaaaabbacaccbbcbbcbbaaaaabaccccaaccbccaccbccabccbacbaaaccccbcbbbaabcbaabbcbacaaccccbccbbbbacacabccbcbacaacbcaaccaabacabbabcaaacccccacbbccbabcabaccababbbaacbcbccbccacbcccacbacbabacabcbacbcabcacbcbccbcbbbbbabaaababbccababcbccbabbaaabbcababcaabaaacccaaccabacccbcccbcabcabcaccaaabcabbaccabacbccbaabcbbacccabbbabaaaccaaacbcbccbababbbacaacaaabcacaababbcaabbacbabbbacacbaabbccbababbcaabcbababccccbabcbbbcbcbacbcbcabaccbccccbaaabbaacabcbbacaccbaaabcbaaacbcaabaaccabbcabbbabaacbcccbcabbcacccababcbbbbcabcbacaacabbacbbabcaabacbbbabbccaaaaacbabbbbcbcccbaacaaabacbacbabbbccabcbabbabbaccbbacacbacbccacbaabbcbccbbbaabbcacccbabbbabbbcaacababccaccacbbcaaaabbbccbbcbcaccabbaacccbacbcacabbcbbbacbaaccccaaaccaacbcbacbbccacbbcacccacbabaaabbbcaabccaacbbcbccbbaabacaccacaacaaaaaabbbcccbbcbbbbcabababbcbccbcbbbbcaabbccbcaaaccbbccabcaaacacbcbcaabbbbabacbaabbcacbbacccabaacaacaabbabacaaccccbccbccbbaaaaabcaacbccbcccaaabacacbbacaacccbcbcaaaccabbbabcbcaacbaccacbbbaccbacbacbcbcabccccccaaabbaacabccaaababbbbaabbbbaabcacccacabbcbcacbbbaabccbaabacccacaaccaccbabccbcbababbcaaccaaaaabbbacccbbbaaabcabbbcabaccccabbbabaabaaccbaaabcbbbcaaaccbcabbaaaaccccbcbbcbacbbbabbcbaabcccccaaacabbcaacbcccbacbbaaabcbcabbacabbcbabbcaacaccbaabccaaacbaaaabcbbbbabcccbbbbbcabccaabbbaababaccbbbbbbcbcbacaaaabcccccbaccbbbbacacbabcabcababcccccbaccccbbcababcbabaacbaabcababcbcbcbaabaacaccccabcbaacbabcbbabcbcabcaaacccacaaabccbcbacbcbbccbbacaccbbcccaccaaaacbcbcaabcbbcbccbacbcacabacccabcaababcabbabcbbbbcbcbcabcabbcabbbcccabaaaababababaacbbabcbcbaaaabccaacabcccbbaacbccababcbaabbbababbbabbbcbaacacbabacaaabbbcbabcacacccbbbccacaabcacccacbabbacbacbbaacaaababbcabaabbcccacbccaaaacbccbabcbacbbabbbabbbacaabccbcbbccccbacbaccaaaacaaccaccabaabcbbbbccbcbccbcacbcacbccbccbcbacccacbbcbaacacccaabbbabcaabbbabcacbbcabbcbbaabbacaccaaabcbbaaccbccccbbcbaaaaaacabcacbcbccaabcacbcaaaacaabacacccbcbbbcaabbcbbcababcacbacacaaabcccbbbcabccaccaabcbbbccaccacacacbccaaaabcbcbbbccabcabbcbbccbbbcaccccabbaabacabbbcbaacccbbcbcaaabbabcccacabbbabcaaaaacacbbcaacccccacacbcbbcbbabccabaacbabccbbbcaabbccabcbaccbbaacbbabaabcbbbabccccbaabbcbcacacbccbccaabbcccbcbabcabcabcababbcccbacbccacabbccccabacbcaaaabacbacbcbaccbaaaabcbcbbbbcbbbaacbacbacaacccbabacccccbcbbabbcbcabcccbacaabaaabcccabcaccbcaababcccbabbabccbcccbacbaacaacacacaacbcabbabbcbaaaaabcbccabccaabcbaccaaaccbacacabacbaaabccbcabcbaabbaccbaabcbccabcacaaacbcbbabccbcaccabcacbacbbacaccccbccbccccbbabccbcacaacabaabaccabcbbccacbcbcaacbaccccaacbaacaccaacaaababaabcbcabaccbbaaabbaabaccbccbbbcbcbbbcbccccabacbcbabbbbcbbbabbacbccaccccaacccaccccaabccacbcbbcccaaaabababbcaacbbaababbcaacbbaacaabcbbbaaaacbcabcabbcaaccaacbcccbcabcaaababbcbbbcbbbcacacbabacccbacabacbcbccaabcabaabcaacbcbabcbcababbbabbbbabcacabccaacaacabcccbbabbcaabcbacabbabcabaacccbbccbcabbbaccacbbabcaaabbbcbabcaabcbcababcbbabaaaabacaaabbbacccbbbbcabacacaacbccaccaabbabacbcaacbbacabaacaacaaabcacacbbbbccbabbcbccbcaccbabcbaacacbcbcacabbbaabccccaaccbccbaaaabccbbabcababacabbccbcabcbcccabbcaababccbbabcabcbcacbabacccbbaabccbcababcbaacabacaccbbbbbcbcbaacbccacccccbccbbaccabccbcbacccabcbaababaaabbcbcacabaaaababacccacbcccbaccacbabcacacccabaaaacbbaccbabbbbbbbcaccccbbaabcccbbaaabaabbcbabbcabaabbabbabbcbcacaaaaababcabcccacbbccbbacbbabacbbccbbcbaabbabbcbaacaaacbababbaacabaabbbbacccaabaabccabcabababbaababaccabccaccaccabaaababacbbbaaccbbcccaaacabbabccbcbcaaaccccabcbabbaaaaacabacacaacbbcbabacaabccbcbcaaabacbbcbabcccaacacaccccaabcacbbcaaaabbacaabcbaaaacaacccbccbcabcaacabcabcaaaaabbaaaabbabaabacbcaaaabbacbaaccbbcbbcccbbaabccacabacccccbbbbabbbbbcaccbcacaaabbacaaaacccccbccbaacacabccacbabaabbcbcabcbaacacbcbccbbaccaacaabaacabccccbbcbacbcaabbbbbbcbbbcaacaaccabbccbcbabbacaacaaccbacbbcbbcbbbccaaababcacabbabaacbcbaacbacbaacaaaaabccacbbbbaaaaccacaacbcacccacabcccbaabbaccbbbbbbbcacbaacbcacbabcaaaacbbcbabbbabcccabbbaaaaacccccacacccbbbcbacbbbaabaccbcaaabccccbcaacbaacccaababccccbbbcabcbbbaaabbcbcabcaaaaabcaaacbcbaccbcbaabcaabbacbaacbbacaaacccbbcacacacbbcbacacccbcccabcabbcabbabcccbbacbacababaccabababbcbaaaabbcaaaaacbaaacacaaaaccabacabbaaaabbbaacccbbacccbacbacabcabcaaacaaaacaaccbbaabbbcabbcbcacbaccacacabbcabcacbcbccccacbaacaccbccbbcabcbabaaabaabcbaccaababbcaacbaabcabbbcbcaaaacbaccacaccaccacbaa +bbcccab +"; + + private const string Out2 = @"287 1585 3612 4294 10800 12025 20604 26894 +"; + + public void Dispose() + { + var standardOut = new StreamWriter(Console.OpenStandardOutput()); + standardOut.AutoFlush = true; + var standardIn = new StreamReader(Console.OpenStandardInput()); + Console.SetOut(standardOut); + Console.SetIn(standardIn); + } + + [Theory] + [InlineData("AB", 3, 7, 1)] + [InlineData("ABB", 3, 7, 4)] + [InlineData("BBA", 3, 7, 5)] + [InlineData("ABBA", 3, 7, 5)] + [InlineData("aba", 257, 3571, 907)] + [InlineData("bab", 257, 3571, 2422)] + public void TestHash1(string input, ulong x, ulong p, ulong exp) + { + var res = RabinCarp.CalculateHash(input, x, p); + Assert.Equal(exp, res); + } + + [Theory] + [InlineData("ABB", 'A', 4, 3, 7, 5)] + [InlineData("aba", 'b', 907, 257, 3571, 2422)] + [InlineData("bab", 'a', 2422, 257, 3571, 907)] + public void TestSlidingHash1(string input, char append, ulong hash, ulong x, ulong p, ulong exp) + { + ulong multiplier = 1; + for (int i = 1; i < input.Length; i++) + { + multiplier *= x; + multiplier %= p; + } + + var res = RabinCarp.SlidingHash(input, append, hash, x, p, multiplier); + Assert.Equal(exp, res); + } + + [Theory] + [InlineData(Inp1, Out1)] + [InlineData(Inp2, Out2)] + public void Test1(string input, string expected) + { + var stringWriter = new StringWriter(); + Console.SetOut(stringWriter); + + var stringReader = new StringReader(input); + Console.SetIn(stringReader); + + // act + RabinCarp.RabinCarpMethod(); + + // assert + var output = stringWriter.ToString(); + + // var result = string.Join(Environment.NewLine, output); + Assert.Equal($"{expected}", output); + } + } +} \ No newline at end of file diff --git a/CourseApp/Module3/RabinCarp.cs b/CourseApp/Module3/RabinCarp.cs new file mode 100644 index 0000000..6fc7778 --- /dev/null +++ b/CourseApp/Module3/RabinCarp.cs @@ -0,0 +1,75 @@ +namespace CourseApp.Module3 +{ + using System; + using System.Collections.Generic; + using System.Text; + + public class RabinCarp + { + public static ulong CalculateHash(string inp, ulong x, ulong p) + { + ulong hash = 0; + for (int i = 0; i < inp.Length; i++) + { + hash = ((hash * x) + (ulong)(inp[i] - 'A')) % p; + } + + return hash; + } + + public static ulong SlidingHash(string inp, char appended, ulong hash, ulong x, ulong p, ulong multiplier) + { + ulong newHash = hash + p; + newHash -= (multiplier * (ulong)(inp[0] - 'A')) % p; + newHash *= x; + newHash += (ulong)(appended - 'A'); + newHash %= p; + + return newHash; + } + + public static void RabinCarpMethod() + { + string s = Console.ReadLine(); + string t = Console.ReadLine(); + ulong x = 257; + ulong p = 3571; + + ulong multiplier = 1; + for (int i = 1; i < t.Length; i++) + { + multiplier *= x; + multiplier %= p; + } + + ulong hash_t = 0; + ulong hash_s = 0; + for (int i = 0; i < t.Length; i++) + { + hash_t = ((hash_t * x) + (ulong)(t[i] - 'A')) % p; + hash_s = ((hash_s * x) + (ulong)(s[i] - 'A')) % p; + } + + var res = new List(); + for (int i = 0; i <= (s.Length - t.Length); i++) + { + if (hash_s == hash_t && t == s.Substring(i, t.Length)) + { + res.Add(i); + } + + if ((i + t.Length) < s.Length) + { + hash_s += p; + hash_s -= (multiplier * (ulong)(s[i] - 'A')) % p; + hash_s *= x; + hash_s += (ulong)(s[i + t.Length] - 'A'); + hash_s %= p; + } + } + + string result = string.Join(" ", res); + Console.WriteLine(result); + } + } +}