예제 #1
0
        public SuffTree(List <char> rgabc, List <char> rgv)
        {
            this.rgv = rgv;

            Root  = new SuffNode();
            node0 = new SuffNode();
            for (var j = 1; j <= rgabc.Count; j++)
            {
                node0.AddEdge(-j, -j, Root, rgabc[j - 1]);
            }
            Root.SetSuffixLink(node0);

            var node    = Root;
            var ich     = 1;
            var ichNext = 0;

            while (ichNext != rgv.Count)
            {
                ichNext++;
                Update(ref node, ref ich, ichNext);
                Canonize(node, ich, ichNext, out node, out ich);

                //Console.WriteLine(t(i));
                //Console.WriteLine(root.TSTO(this));
                //Console.ReadLine();
            }
        }
예제 #2
0
        private void TestAndsplit(SuffNode node, int ichFirst, int ichLast, char ch, out bool fEnd, out SuffNode nodeNext)
        {
            if (ichFirst <= ichLast)
            {
                var edge = node.MpEdgeByCh[rgv[ichFirst - 1]];
                if (ch == rgv[edge.IchFirst + ichLast - ichFirst])
                {
                    fEnd     = true;
                    nodeNext = node;
                    return;
                }

                nodeNext = new SuffNode();
                nodeNext.AddEdge(edge.IchFirst + ichLast - ichFirst + 1, edge.IchLast, edge.Node, rgv[edge.IchFirst + ichLast - ichFirst]);
                edge.IchLast = edge.IchFirst + ichLast - ichFirst;
                edge.Node    = nodeNext;

                fEnd = false;
                return;
            }

            if (!node.MpEdgeByCh.ContainsKey(ch))
            {
                fEnd     = false;
                nodeNext = node;
                return;
            }

            fEnd     = true;
            nodeNext = node;
        }