Trang chủ Tin Học Lớp 10 C++ Vì không có bố mẹ từ bé nên hằng...

C++ Vì không có bố mẹ từ bé nên hằng ngày ngoài thời gian đến trường Chí phải đi chăn bò thuê kiếm tiền. Vào một ngày nọ, Chí đã gặp một dòng văn bản hấp dẫn

Câu hỏi :

C++ Vì không có bố mẹ từ bé nên hằng ngày ngoài thời gian đến trường Chí phải đi chăn bò thuê kiếm tiền. Vào một ngày nọ, Chí đã gặp một dòng văn bản hấp dẫn được khắc vào một tảng đá lớn ở giữa vùng chăn thả bò yêu thích của mình. Ý nghĩa của dòng văn bản dường như là từ một ngôn ngữ cổ xưa bí ẩn liên quan đến một bảng chữ cái chỉ gồm ba ký tự C, O, và W. Mặc dù Chí không thể giải mã văn bản nhưng COW là mẫu từ yêu thích của Chí, và cậu tự hỏi có bao nhiêu lần COW xuất hiện trong dòng văn bản. Chí không phiền lòng nếu có những kí tự khác xen kẽ trong COW, miễn rằng các kí tự xuất hiện theo thứ tự đúng là C, O, W. Chí cũng không ngại nếu các lần xuất hiện khác nhau của COW có chung một số chữ cái. Ví dụ, COW xuất hiện một lần trong CWOW, hai lần trong CCOW, và tám lần trong CCOOWW. Em hãy vui lòng giúp Chí đếm xem có bao nhiêu lần COW xuất hiện trong dòng văn bản đã gặp. Dữ liệu: Vào từ file văn bản cword.inp: Dòng đầu tiên gồm một số nguyên duy nhất N 105. Dòng thứ hai chứa một chuỗi gồm N ký tự C, O, hay W. Kết quả: Ghi ra file văn bản cword.out chỉ một số nguyên duy nhất là số lần COW xuất hiện như một dãy con (các kí tự không nhất thiết phải liên tục) trong chuỗi input. Ví dụ: cword.inp cword.out 6 COOWWW 6

Lời giải 1 :

Thuật toán

Ta sẽ sử dụng thuật toán quy hoạch động cho bài này

Gọi $s_i$ là ký tự thứ $i$ của xâu đã cho $s$.

Gọi $f(i), g(i), h(i)$ lần lượt là số dãy con (như định nghĩa trong đề) bằng C, CO và COW của xâu $s_1s_2\ldots s_i$. Quy ước $f(0) =g(0) = h(0) = 0$. Từ định nghĩa này, ta thấy ta cần tính $h(n)$

Ta sẽ duyệt $i=1,2,\ldots,n$ theo thứ tự. Với mỗi $i$, ta sẽ tìm cách tính $f(i), g(i), h(i)$. Như vậy, kết hợp với $f(0)=g(0)=h(0)=0$, khi ta duyệt đến $i$, ta đã tính được $f(i-1), g(i-1), h(i-1)$. Với mỗi chữ cái, xét 3 TH:

TH1: $s_i$ là chữ cái C

Trong trường hợp này, ta có tổng cộng $f(i-1)$ dãy con C và chỉ có thêm 1 dãy con C chính là xâu $s_i$. Do đó, $f(i) = f(i-1) + 1$. $g(i)$ và $h(i)$ không có gì thay đổi so với $g(i-1), h(i-1)$

TH2: $s_i$ là chữ cái O

Ta có tổng cộng $g(i-1)$ dãy con CO từ xâu $s_1s_2\ldots s_{i-1}$. Với chữ cái O ở vị trí $i$, ta có thể ghép với $f(i-1)$ dãy con C từ vị trí $i-1$ trở về trước để tạo thành $f(i-1)$ dãy con CO nữa. Như vậy, tổng cộng ta có $g(i) = g(i-1) + f(i-1)$ dãy con CO trong xâu $s_1s_2\ldots s_i$

$f(i)$ và $h(i)$ không có gì thay đổi so với $f(i-1), h(i-1)$

TH3: $s_i$ là chữ cái W

Tương tự thì ta cũng có $h(i) = h(i-1) + g(i-1)$ và $f(i), g(i)$ không thay đổi so với $f(i-1), g(i-1)$

Code (C++)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;

int n;
string s;
// Su dung long long de tranh tran so
long long f[N], g[N], h[N];

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    freopen("CWORD.inp","r",stdin);
    freopen("CWORD.out","w",stdout);
    // code here
    cin >> n;
    cin >> s;
    // 1-indexed
    s = ' ' + s;
    // Quy uoc
    f[0] = 0; g[0] = 0; h[0] = 0;
    for(int i=1;i<=n;i++){
        // Truong hop khong doi
        f[i] = f[i-1];
        g[i] = g[i-1];
        h[i] = h[i-1];
        if(s[i] == 'C'){
            f[i] = f[i-1] + 1;
        }else if(s[i] == 'O'){
            g[i] = g[i-1] + f[i-1];
        }else if(s[i] == 'W'){
            h[i] = h[i-1] + g[i-1];
        }
    }
    cout << h[n];
    return 0;
}

Bạn có biết?

Tin học là một ngành khoa học chuyên nghiên cứu quá trình tự động hóa việc tổ chức, lưu trữ, xử lý và truyền dẫn thông tin của một hệ thống máy tính cụ thể hoặc trừu tượng. Tin học bao hàm tất cả các nghiên cứu và kỹ thuật có liên quan đến việc mô phỏng, biến đổi và tái tạo thông tin. Hãy tận dụng sức mạnh của tin học để giải quyết các vấn đề và sáng tạo ra những giải pháp mới!

Nguồn :

Wikipedia - Bách khoa toàn thư

Tâm sự lớp 10

Lớp 10 - Năm đầu tiên ở cấp trung học phổ thông, chúng ta sẽ có nhiều bạn bè mới đến từ những nơi khác nhau. Ngôi trường mới, xa nhà hơn, mở ra một thế giới mới với nhiều điều thú vị. Hãy mở lòng đón nhận và tận hưởng những trải nghiệm mới!

Nguồn :

sưu tập

Liên hệ hợp tác hoặc quảng cáo: gmail

Điều khoản dịch vụ

Copyright © 2021 HOCTAPSGK