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))); }
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(); }
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); }