Пример #1
0
    static void Main()
    {
        var s  = Console.ReadLine();
        var n  = s.Length;
        var q  = int.Parse(Console.ReadLine());
        var ps = new int[q].Select(_ => Console.ReadLine());

        var sa = ManberMyers(s);
        var rh = new RH(s);

        Func <int, string, RH, int> compare = (i, p, prh) =>
        {
            var preCount = Last(0, Math.Min(n - i, p.Length), x => rh.Hash(i, x) == prh.Hash(0, x));
            if (i + preCount == n ^ preCount == p.Length)
            {
                return(preCount == p.Length ? 1 : -1);
            }
            if (preCount == p.Length)
            {
                return(0);
            }
            return(s[i + preCount] - p[preCount]);
        };

        Func <string, bool> match = p =>
        {
            var prh   = new RH(p);
            var order = First(0, n + 1, o => compare(sa[o], p, prh) >= 0);
            return(order <= n && sa[order] + p.Length <= n && rh.Hash(sa[order], p.Length) == prh.Hash(0, p.Length));
        };

        Console.WriteLine(string.Join("\n", ps.Select(p => match(p) ? 1 : 0)));
    }
Пример #2
0
    static void Main()
    {
        Console.SetOut(new StreamWriter(Console.OpenStandardOutput())
        {
            AutoFlush = false
        });

        var s = Console.ReadLine();
        var p = Console.ReadLine();
        var n = s.Length;
        var m = p.Length;

        if (n < m)
        {
            return;
        }

        var sh = new RH(s);
        var ph = RH.Hash(p);

        for (int i = 0; i + m <= n; i++)
        {
            if (sh.Hash(i, m) == ph)
            {
                Console.WriteLine(i);
            }
        }
        Console.Out.Flush();
    }
Пример #3
0
    static void Main()
    {
        var s = Console.ReadLine();
        var n = s.Length;

        var sa = ManberMyers(s);
        var rh = new RH(s);

        var r = 0L;

        // 前の文字列と一致した部分より後ろの文字数を加算します。
        for (int i = 0; i < n; i++)
        {
            r += n - sa[i + 1] - Last(0, Math.Min(n - sa[i], n - sa[i + 1]), x => rh.Hash(sa[i], x) == rh.Hash(sa[i + 1], x));
        }
        Console.WriteLine(r);
    }