
Các bài toán có dữ liệu vào rất lớn, thường gây cho ta rất nhiều khó khăn. Để giải được
các bài toán đó thì cần phải tìm cấu trúc dữ liệu và giải thuật thật hợp lý. Đa số các bài
toán dạng này thì phải vừa đọc vừa xử lý. Lấy ví dụ bài toán đơn giản sau:
Bài toán: Tìm dòng đặc biệt
Cho một tệp văn bản có n dòng (n <=100000) mỗi dòng có độ dài không quá 255 ký tự..
Trong đó có một dòng chỉ xuất hiện một lần duy nhất, còn các dòng còn lại có số lần
xuất hiện là một số chẵn. Bạn hãy lập trình để chỉ ra dòng đặc biệt đó.
Dữ liệu vào: tệp dacbiet.inp
- Ghi các dòng thông tin và kết thúc tệp bởi 1 dòng có 3 ký tự ###
Dữ liệu ra: tệp dacbiet.out
- Ghi ra dòng đặc biệt tìm được
Ex:
Giải: Với dữ liệu vào rất lớn n <=10000 thì giải thuật đơn giản nhất là cứ đọc một dòng
bất kỳ sau đó so sánh với các dòng tiếp, nếu không thấy xuất hiê.n quá 1 lần thì nó chính
là dòng đặc biệt, ngược lại thì thực hiện với dòng kế tiếp. Nhưng nếu dòng đặc biệtt đó là
dòng cuối cùng thì số lần đọc tệp sẽ rất nhiều nên thời gian chạy chương trình cũng rất
lâu. Mặt khác ta không thể lưu trữ vào mảng đượcc nên ta phải vừa đọc, vừa xử lý.
Thuật toán: sử dụng phép XOR. Như ta đã biết:
Dựa vào tính: Nếu A xor B với số lần thực hiện là số chẵn thì cho ta A nên ta có thuật
toán để giải bài này như sau: