Ejemplo n.º 1
0
        public static IEnumerable <long> Solve(string[] commands)
        {
            var level     = new SequenceLevel();
            var solutions = new Stack <long>();

            for (var t = 0; t < commands.Length - 1; t++)
            {
                var command = commands[t + 1];
                var sol     = 0L;
                if (command[0] == '+')
                {
                    var x = long.Parse(command.Substring(2));
                    //var shortcut = level.Seq.Count > 0 && x == level.Seq[(int)solutions.Peek()] ? (long?)(solutions.Peek() + 1) : null;
                    level.AddLetter(x);
                    sol = Solve_Reduce_Rec(level);
                    solutions.Push(sol);

                    //Console.WriteLine();
                    //var lll = level;
                    //while (lll.Seq.Count > 0)
                    //{
                    //	Console.WriteLine(lll.Seq.Join() + " -> " + CalcMinLen(lll.lengths));
                    //	lll = lll.DeeperLevel;
                    //}
                }
                else if (level.Seq.Count > 0)
                {
                    level.RemoveLastLetter();
                    solutions.Pop();
                    sol = solutions.Count > 0 ? solutions.Peek() : 0;
                }

                yield return(Solve_Reduce_Rec(level));
            }
        }
Ejemplo n.º 2
0
        public static long Solve_Reduce_Rec(SequenceLevel level)
        {
            var seq = level.Seq;

            if (seq.Count <= 1)
            {
                return(0);
            }
            if (seq.AllSame())
            {
                return(seq.Count - 1);
            }
            if (seq.Count == 2)
            {
                return(0);
            }

            var nextSeq = level.DeeperLevel.Seq;

            if (level.DeeperLevel.Seq.Count == 0)
            {
                return(0);
            }

            if (seq[0] == seq.Last())
            {
                var sub = Solve_Reduce_Rec(level.DeeperLevel);
                return(1 + level.TranslateLength(nextSeq, sub));
            }

            {
                var tagLen = 1 + level.Tag.Count;

                var k = 0L;

                var firstLetter = new List <long>();
                for (var i = 1; i < seq.Count; i++)
                {
                    if (seq[i] == seq[0])
                    {
                        break;
                    }
                    else
                    {
                        firstLetter.Add(seq[i]);
                    }
                }

                var isPrefix = true;
                for (var i = 0; i < level.Tag.Count; i++)
                {
                    if (i >= firstLetter.Count || firstLetter[i] != level.Tag[i])
                    {
                        isPrefix = false;
                        break;
                    }
                }
                if (isPrefix)
                {
                    k = tagLen;
                }

                foreach (var repl in level.LettersMap.GetAllContinuations(level.Tag))
                {
                    level.DeeperLevel.AddLetter(repl.Value);

                    var sub    = Solve_Reduce_Rec(level.DeeperLevel);
                    var subLen = level.TranslateLength(nextSeq, sub);
                    k = Math.Max(subLen - repl.Length - 1 + tagLen, k);

                    level.DeeperLevel.RemoveLastLetter();
                }

                return(k);
            }
        }
Ejemplo n.º 3
0
            public void AddLetter(long letter)
            {
                if (Seq.Count == 0)
                {
                    a = letter;
                    Seq.Add(letter);
                }
                else
                {
                    if (letter == a)
                    {
                        if (Tag.Count == 0)
                        {
                            var minLen = CalcMinLen(lengths);
                            if (minLen != minLength && DeeperLevel.Seq.Count > 0)
                            {
                                var deepA     = DeeperLevel.Seq[0];
                                var deepSeq   = DeeperLevel.Seq.Take(DeeperLevel.Seq.Count - DeeperLevel.Tag.Count).ToList();
                                var deepTag   = DeeperLevel.Tag;
                                var letterMap = DeeperLevel.LettersMap;
                                deeperLevel = new SequenceLevel {
                                    Level = Level + 1, LettersMap = letterMap
                                };

                                foreach (var list in GroupByA(deepSeq, deepA))
                                {
                                    if (list[0] == deepA)
                                    {
                                        for (var i = 0; i < list.Count; i++)
                                        {
                                            deeperLevel.AddLetter(deepA);
                                        }
                                    }
                                    else
                                    {
                                        foreach (var l in list)
                                        {
                                            deeperLevel.AddLetter(l);
                                        }
                                    }
                                }

                                foreach (var l in deepTag)
                                {
                                    deeperLevel.AddLetter(l);
                                }

                                minLength = minLen;
                            }
                        }

                        var b = LettersMap.GetMap(Tag);
                        lengths.Add(Tag.Count);
                        Tag.Clear();
                        DeeperLevel.AddLetter(b);
                    }
                    else
                    {
                        Tag.Add(letter);
                    }
                    Seq.Add(letter);
                }
            }