Tách từ

Xem dạng PDF

Gửi bài giải


Điểm: 0,33 (OI)
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Nguồn bài:
Croatian OI 2006
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Một từ cần được tách thành các đoạn con sao cho mỗi đoạn con thuộc một tập các từ cho trước.

Viết chương trình xác định số cách tách một từ cho trước.

Do kết quả có thể có giá trị lớn, chỉ cần in ra phần dư của kết quả cho ~1337377~.

Input

  • Dòng đầu tiên chứa một từ với tối đa ~300000~ ký tự.
  • Dòng thứ hai chứa số nguyên ~N~, ~1\leq N \leq 4000~.
  • Mỗi dòng trong số ~N~ dòng tiếp theo chứa một từ trong tập các từ. Mỗi từ có độ dài không quá ~100~ ký tự. Không có hai từ nào giống nhau. Tất cả các ký tự đều là chữ cái Latin in thường.

Output

  • In ra một số nguyên duy nhất là phần dư của số cách tách từ khi chia cho ~1337377~.

Sample Input 1

abcd
4
a
b
cd
ab

Sample Output 1

2

Sample Input 2

afrikapaprika
4
afr
ika
pap
r

Sample Output 2

1

Sample Input 3

ababababababababababababababababababababab
3
a
b
ab

Sample Output 3

759775

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 6
    hieuhfgr  đã bình luận lúc 18, Tháng 6, 2024, 6:48 chỉnh sửa

    Hint

    Nếu ta gọi ~cnt_i~ là số cách tách xâu con ~s~ từ ~1 -> i~.

    Tạo Trie cho dãy ~a~.

    Solution:

    (~s~ là xâu từ trong đề bài). Gọi ~cnt_i~ là số cách tách xâu ~s[1..i]~ mà mỗi xâu con đều ở trong tập các từ cho trước. Kết quả của ta là ~cnt_n~ Dễ thấy, ~cnt_i~ sẽ được tính bằng tổng các ~cnt_j~ với ~j~ ~(0 \le j < i)~ là vị trí mà xâu con ~s[j+1..i]~ nằm trong tập các từ. Vì tập các từ có độ dài không vượt quá 100 nên ta có thể for các vị trí ~i~ và for ~j~ mà vẫn đảm bảo độ phức tạp. Việc của chúng ta là cài Trie sao cho tối ưu thoai :3

    lần đầu viết sol mong mọi ng đừng downvote T_T


  • 8
    thangdz  đã bình luận lúc 11, Tháng 1, 2022, 14:35

    very interesting