using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;

public static class Karakterek
{
    public static List<char> KarakterekList = new List<char>();
    public static void ReadDataFromFile(string path)
    {
        KarakterekList = File.ReadAllText(path).ToCharArray().ToList();
    }

    public static List<char> LongestStringWithTwoCharactersOnly()
    {
        if (KarakterekList.Count < 2)
            return new List<char>();

        List<char> currentBestCharacterSequence = new List<char>();
        List<char> currentCharacterSequence = new List<char>();

        char firstChar = KarakterekList[0];
        char secondChar = KarakterekList[1];

        currentCharacterSequence.Add(firstChar);
        currentCharacterSequence.Add(secondChar);

        for (int i = 2; i < KarakterekList.Count; i++)
        {
            char item = KarakterekList[i];

            if (item == firstChar || item == secondChar)
            {
                currentCharacterSequence.Add(item);
            }
            else
            {
                if (currentCharacterSequence.Count > currentBestCharacterSequence.Count)
                {
                    currentBestCharacterSequence = new List<char>(currentCharacterSequence);
                }

                firstChar = currentCharacterSequence[currentCharacterSequence.Count - 1];
                secondChar = item;

                currentCharacterSequence.Clear();
                currentCharacterSequence.Add(firstChar);
                currentCharacterSequence.Add(secondChar);
            }
        }

        if (currentCharacterSequence.Count > currentBestCharacterSequence.Count)
        {
            currentBestCharacterSequence = currentCharacterSequence;
        }

        return currentBestCharacterSequence;
    }

    public static int CountABCSequences(string input)
    {
        int count = 0;
        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == 'a')
            {
                for (int j = i + 1; j < input.Length; j++)
                {
                    if (input[j] == 'b')
                    {
                        for (int k = j + 1; k < input.Length; k++)
                        {
                            if (input[k] == 'c')
                            {
                                count++;
                            }
                        }
                    }
                }
            }
        }
        return count;
    }

    public static int TotalDistanceTraveled(string input){
        int x = 0;
        int y = 0;

        for (int i = 0; i < input.Length; i++)
        {
            if (input[i] == 'b')
            {
                x++;
            }
            else if (input[i] == 'd')
            {
                x--;
            }
            else if (input[i] == 'a')
            {
                y++;
            }
            else if (input[i] == 'c')
            {
                y--;
            }
        }
        return (int)Math.Sqrt(Math.Pow(x, 2) + Math.Pow(y, 2));
    }
}

public static class Szoveg{
    public static List<string> fullTextInListOfString = new List<string>();
    public static List<string> wordsWithUniqeCharactersOnly = new List<string>();


    public static void ReadDataFromFile(string path)
    {
        var lines = File.ReadAllText(path).Split(new string[] { Environment.NewLine }, StringSplitOptions.None).ToList();

        foreach (var line in lines)
        {
            var allStringsInLine = line.Split(' ');
            foreach (var str in allStringsInLine)
            {
                fullTextInListOfString.Add(str);
            }
        }
    }

    public static List<string> WordsWithUniqeCharactersOnly()
    {
        foreach (var word in fullTextInListOfString)
        {
            if (word.Distinct().Count() == word.Length)
            {
                wordsWithUniqeCharactersOnly.Add(word);
            }
        }

        return wordsWithUniqeCharactersOnly;
    }

    public static string LongestStringWithUniqueCharacters()
    {
        return wordsWithUniqeCharactersOnly.OrderByDescending(s => s.Length).First();
    }

    public static int GreatestDistanceBetweenWords(string input)
    {
        int maxDistance = 0;
        int? firstIndex = null;
        
        int firstEndIndex = 0;
        int? secondIndex = null;
        int secondStartIndex = 0;
        int secondEndIndex = 0;

        for (int i = 1; i < input.Length - 2; i++)
        {
            // új névelő megtalálva
            if  (input[i] == 'A' && input[i - 1] == ' ' && input[i + 1] == ' ')
            {
                if  (firstIndex == null)
                {
                    firstIndex = i;
                    firstEndIndex = i;
                    continue;
                }

                if  (secondIndex == null && firstIndex != null)
                {
                    secondIndex = i;
                    secondStartIndex = i;
                    secondEndIndex = i;
                }

                // kettő közötti távolság
                int distance = Convert.ToInt32(secondStartIndex - firstEndIndex - 1);
                if  (distance > maxDistance)
                {
                    maxDistance = distance;
                }

                firstIndex = secondIndex;
                
                firstEndIndex = secondEndIndex;

                secondIndex = i;
                secondStartIndex = i;
                secondEndIndex = i;

                continue;
            }

            if (input [i] == 'A' && input[i + 1] == 'Z' && input[i - 1] == ' ' && input[i + 2] == ' '){
                if  (firstIndex == null)
                {
                    firstIndex = i;
                    firstEndIndex = i + 1;
                    continue;
                }

                if  (secondIndex == null && firstIndex != null)
                {
                    secondIndex = i;
                    secondStartIndex = i;
                    secondEndIndex = i + 1;
                }

                // kettő közötti távolság
                int distance = Convert.ToInt32(secondStartIndex - firstEndIndex - 1);
                if  (distance > maxDistance)
                {
                    maxDistance = distance;
                }

                firstIndex = secondIndex;
                
                firstEndIndex = secondEndIndex;
                
                secondIndex = i;
                secondStartIndex = i;
                secondEndIndex = i + 1;
            }
        }
        
        return maxDistance;
    }
}

    public class Program
    {
        public static void Main(string[] args)
        {
            Karakterek.ReadDataFromFile(@"..\karsor.txt");

            //System.Console.WriteLine($"{Karakterek.KarakterekList.Count}");

            // feladat 1 a
            /*
            var longestStringWithTwoCharactersOnly = Karakterek.LongestStringWithTwoCharactersOnly();
            var karakterek = longestStringWithTwoCharactersOnly.Distinct().OrderBy(c => c).ToArray();
            int longestStringWithTwoCharactersOnlyLength = longestStringWithTwoCharactersOnly.Count;

            System.Console.WriteLine($"{karakterek[0]}{karakterek[1]}{longestStringWithTwoCharactersOnlyLength}");
            */

            // feladat 1 b
            
            // ez az input változó volt használva a b és a c részben is
            //string input = new string(Karakterek.KarakterekList.ToArray());

            //System.Console.WriteLine($"{Karakterek.CountABCSequences(input)}");

            // feladat 1 c
            //System.Console.WriteLine($"{Karakterek.TotalDistanceTraveled(input)}");

            // feladat 2 a

            Szoveg.ReadDataFromFile(@"..\testinput.txt");

            /*
            Szoveg.wordsWithUniqeCharactersOnly = Szoveg.WordsWithUniqeCharactersOnly();

            System.Console.WriteLine($"{Szoveg.LongestStringWithUniqueCharacters()}");
            */

            // feladat 2 b
            string fullTextInSingleString = string.Join(" ", Szoveg.fullTextInListOfString);

            int value = Szoveg.GreatestDistanceBetweenWords(fullTextInSingleString);

            System.Console.WriteLine($"{value}");

        }
    }