結果
問題 | No.430 文字列検索 |
ユーザー |
![]() |
提出日時 | 2025-03-28 00:54:11 |
言語 | Go (1.23.4) |
結果 |
TLE
|
実行時間 | - |
コード長 | 4,034 bytes |
コンパイル時間 | 13,559 ms |
コンパイル使用メモリ | 249,440 KB |
実行使用メモリ | 7,324 KB |
最終ジャッジ日時 | 2025-03-28 00:54:43 |
合計ジャッジ時間 | 29,157 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 10 TLE * 4 |
ソースコード
package main import ( "bufio" "fmt" "math" "os" "strconv" ) const ( MOD = 1000000007 INF = 1 << 62 ) // ================================================== // io // ================================================== var sc = bufio.NewScanner(os.Stdin) var wr = bufio.NewWriter(os.Stdout) func print(x ...interface{}) { fmt.Fprint(wr, x...) } func println(x ...interface{}) { fmt.Fprintln(wr, x...) } func flush() { e := wr.Flush() if e != nil { panic(e) } } // exit exits the program after flushing all buffers. func exit() { flush() os.Exit(0) } // ni scans a single integer. func ni() int { sc.Scan() i, e := strconv.Atoi(sc.Text()) if e != nil { panic(e) } return i } // ni2 scans two integers. func ni2() (int, int) { return ni(), ni() } // ni3 scans three integers. func ni3() (int, int, int) { return ni(), ni(), ni() } // ni4 scans four integers. func ni4() (int, int, int, int) { return ni(), ni(), ni(), ni() } // nu scans a single uint. func nu() uint { sc.Scan() i, e := strconv.Atoi(sc.Text()) if e != nil { panic(e) } return uint(i) } // nu2 scans two uints. func nu2() (uint, uint) { return nu(), nu() } // nu3 scans three uints. func nu3() (uint, uint, uint) { return nu(), nu(), nu() } // nu4 scans four uints. func nu4() (uint, uint, uint, uint) { return nu(), nu(), nu(), nu() } // nf scans a single float64. func nf() float64 { sc.Scan() i, e := strconv.ParseFloat(sc.Text(), 64) if e != nil { panic(e) } return i } // nf2 scans two float64s. func nf2() (float64, float64) { return nf(), nf() } // nc scans a single byte. func nc() byte { sc.Scan() return sc.Text()[0] } // nc2 scans two bytes. func nc2() (byte, byte) { return nc(), nc() } // ns scans a string. func ns() string { sc.Scan() return sc.Text() } // ns2 scans two strings. func ns2() (string, string) { return ns(), ns() } // nis scans a slice of integers. func nis(n int) []int { a := make([]int, n) for i := 0; i < n; i++ { a[i] = ni() } return a } // nis2 scans two slices of integers. func nis2(n int) ([]int, []int) { a := make([]int, n) b := make([]int, n) for i := 0; i < n; i++ { a[i], b[i] = ni2() } return a, b } // nis3 scans three slices of integers. func nis3(n int) ([]int, []int, []int) { a := make([]int, n) b := make([]int, n) c := make([]int, n) for i := 0; i < n; i++ { a[i], b[i], c[i] = ni3() } return a, b, c } // nss scans a slice of strings. func nss(n int) []string { a := make([]string, n) for i := 0; i < n; i++ { a[i] = ns() } return a } // nus scans a slice of uints. func nus(n int) []uint { a := make([]uint, n) for i := 0; i < n; i++ { a[i] = nu() } return a } // nfs scans a slice of float64s. func nfs(n int) []float64 { a := make([]float64, n) for i := 0; i < n; i++ { a[i] = nf() } return a } type KMP struct { table []int p string sz int } func NewKMP(pattern string) *KMP { sz := len(pattern) table := make([]int, sz+1) table[0] = -1 j := -1 for i := 0; i < sz; i++ { for j >= 0 && pattern[i] != pattern[j] { j = table[j] } j++ if i+1 < sz && pattern[i+1] == pattern[j] { table[i+1] = table[j] } else { table[i+1] = j } } return &KMP{ table: table, p: pattern, sz: sz, } } func (kmp *KMP) Count(t string) int { n := len(t) k := 0 cnt := 0 for i := 0; i < n; i++ { for k >= 0 && kmp.p[k] != t[i] { k = kmp.table[k] } k++ if k >= kmp.sz { cnt++ k = kmp.table[k] } } return cnt } func (kmp *KMP) FindAll(t string) []int { n := len(t) k := 0 var positions []int for i := 0; i < n; i++ { for k >= 0 && kmp.p[k] != t[i] { k = kmp.table[k] } k++ if k >= kmp.sz { positions = append(positions, i-kmp.sz+1) k = kmp.table[k] } } return positions } func main() { defer wr.Flush() sc.Split(bufio.ScanWords) sc.Buffer([]byte{}, math.MaxInt32) solve() } func solve() { s := ns() n := ni() ans := 0 for i := 0; i < n; i++ { t := ns() kmp := NewKMP(t) ans += kmp.Count(s) } println(ans) }