VOSSEVEN - Bài toán số 7

Tags: dp

Problem

https://vn.spoj.com/problems/VOSSEVEN

https://oj.vnoi.info/problem/VOSSEVEN

Cho chuỗi gồm N ký tự, mỗi ký tự là một chữ số từ 0 đến 9

Yêu cầu: Với mỗi đoạn con có số 7 liên tiếp hãy đếm xem đoạn con đó xuất hiện bao nhiêu lần trong chuỗi.

Input

Chuỗi S, độ dài N <= 10^6

Output

Mỗi dòng ghi một độ dài tương ứng từ thấp đến cao kèm số lần xuất hiện của nó. Dữ liệu vào đảm bảo xâu có ít nhất 1 số 7. Nếu số lần xuất hiện bằng 0 thì không in ra gì.

Example

Input
72774777

Output
1 6
2 3
3 1

Giới hạn

  • 30% số test có N <= 10^3
  • 30% số test có N <= 10^5.
  • Trong tất cả các test  N <= 10^6.

Tutorial

Trong quá trình duyệt chuỗi, tại mỗi vị trí, nếu là số 7, ta sẽ biết được nó đang nằm trên chuỗi con liên tiếp của bao nhiêu số 7, chẳng hạn với chuỗi 72774777, khi duyệt đến 72774777, ta biết được nó đang nằm trên đoạn con liên tiếp 2 số 7 (tức 2 số 7 trong 477). Khi đó mỗi độ dài tương ứng từ độ dài hiện tại về 1 đều tăng 1 lượt đếm (trong ví dụ này thì độ dài 2 và 1 có thêm 1 lần xuất hiện).

Từ nhận xét trên, cách thuần túy để giải quyết là với mỗi độ dài, ta tăng 1 đơn vị, do đó độ phức tạp sẽ là O(N^2) - không chạy nổi.

Tuy nhiên đây là bài quen thuộc, ta có thể dùng trick là chỉ tăng 1 ở thằng dài nhất, sau đó mới cập lại lại bảng đếm cuối cùng khi đã duyệt xong chuỗi. Cách cập nhật là ở những đoạn ngắn hơn đều tăng tương ứng số lần xuất hiện của đoạn dài hơn trước đó.

Độ phức tạp: O(N).


Submission

VOSSEVEN.cpp