[Thuật toán] Bài toán số 7
[Thuật toán] Bài toán số 7 Tháng Mười 4, 2014 nguyenvanquan7826 Thuật toán Leave a response Đề bài: link Mã bài: 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 ...
[Thuật toán] Bài toán số 7
Đề bài: link
Mã bài: 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
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.
* Gọi f[i] là số các xâu chỉ gồm các số 7 liên tiếp và có độ dài là i.
VD với chuỗi 72774777 thì f[1] = 1, f[2] = 1, f[3] = 1.
* Gọi ans[i] là số các xâu có độ dài i xuất hiện trên xâu s. Dễ dàng nhận thấy nếu từ xâu có độ dài là i sẽ tạo ra được 1 xâu độ dài i, 2 xâu độ dài (i-1), … , nếu có f[i] xâu độ dài i sẽ tạo được ra f[i] xâu độ dài i, f[i]*(i-j+1) xâu độ dài j.
VD f[1] = 1 thì có 1 xâu độ dài 1.
f[2] = 1 thì có 1 xâu độ dài 2, f[2]*(2-1+1) = 2 xâu có độ dài 1.
f[3] = 1 thì có 1 xâu độ dài 3, f[3]*(3-2+1) = 2 xâu độ dài 2, f[3]*(3-1+1) = 3 xâu có độ dài 1.
->Duyệt vòng i, nếu f[i]>0:
->ans[j]=ans[j]+f[i]*(i-j+1), với j0.
#include <iostream>
#include <cstdio>
#include <string>
using namespace std;
int main(){
string s;
cin >> s;
int n = s.length();
int *f = new int[n + 1];
int *ans = new int[n + 1];
for (int i=0; i<=n; i++){
f[i] = ans[i] = 0;
}
// duyet tinh f[i]
for (int i=0; i<n; i++){
int c = 0;
while(i < n && s[i] == '7'){
c++;
i++;
}
if (c > 0){
f++;
}
}
/*
for (int i=1; i<=n; i++){
cout << f[i] << " ";
}
cout << endl;
*/
// duyet tinh ans[i]
for (int i=n; i>0; i--){
if (f[i] > 0){
for (int j=0; j<=i; j++){
ans[j] += f[i]*(i-j+1);
}
}
}
// duyet in ra ket qua
for (int i=1; i<=n; i++){
if (ans[i] > 0){
printf("%d %d
", i, ans[i]);
}
}
//cout << endl;
return 0;
}
Trong code trên các bạn cần lưu ý khi xuất kết quả nên dùng printf, nếu dùng cout thì xuống dòng bằng “ ” vì endl sẽ chậm rất nhiều so với “ ”, mình đã dính đoàn chỗ này. Rất may sau khi tham khảo ý kiếm ace trên VNOI