# Informatyka — zadanie 4.2

> Źródło: matura.lol — https://matura.lol/question/maturazai-informatyka-inf-2018-05/zad/4.2
> Wersja Markdown strony zadania (dla asystentów AI). Przy cytowaniu podaj matura.lol i link powyżej.

- arkusz: Informatyka · Matura · maj 2018 (rozszerzona)
- rok: 2018
- poziom: rozszerzona
- typ: open
- punkty: 4
- działy: Programowanie i algorytmika

## Treść

Kontekst - patrz zadanie 4.1.

Znajdź słowo, w którym występuje największa liczba **różnych** liter. Wypisz to słowo i liczbę występujących w nim różnych liter. Jeśli słów o największej liczbie różnych liter jest więcej niż jedno, wypisz pierwsze z nich pojawiające się w pliku z danymi.

Dla danych z pliku przyklad.txt wynikiem jest:
AKLMNOPRSTWZA 12

## Rozwiązanie — maturazai.pl (AI)

## Poprawna odpowiedź

**Słowo:** `SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN`

**Liczba różnych liter:** **26**

## Sposób 1 - zliczanie unikalnych liter w słowie

**Idea:** dla każdego słowa zlicz **różne** litery (np. używając zbioru). Znajdź słowo z maksymalną liczbą. Przy remisie wybieramy PIERWSZE w kolejności.

**Klucz:** liczba unikalnych liter ≤ 26 (alfabet angielski). Tu maksimum to **26** - słowo zawierające KAŻDĄ literę alfabetu (pangram!).

## Sposób 2 - implementacja Python

```python
najlepsze_slowo = ""
max_roznych = 0

with open('sygnaly.txt', encoding='utf-8') as f:
for linia in f:
s = linia.strip()
if not s:
continue
rozne = len(set(s)) # set automatycznie usuwa duplikaty
if rozne > max_roznych:
max_roznych = rozne
najlepsze_slowo = s

print(f"4.2 {najlepsze_slowo} {max_roznych}")
# 4.2 SUOLDQWISCDRFLRWHZBNTMIAPHALMNCWHVGMXOZSQNXWXSFELZVTUTILXWKCTYBQYSUAKNYJKRXDJQYHXAQGWN 26

## Sposób 3 - C++

```cpp
#include <iostream>
#include <fstream>
#include <string>
#include <set>
using namespace std;

int policzRozne(const string& s) {
set<char> znaki(s.begin(), s.end());
return znaki.size();
}

int main() {
ifstream f("sygnaly.txt");
string s, najlepsze;
int maxRoznych = 0;
while (f >> s) {
int r = policzRozne(s);
if (r > maxRoznych) {
maxRoznych = r;
najlepsze = s;
}
}
cout << "4.2 " << najlepsze << " " << maxRoznych << endl;
return 0;
}

## Sposób 4 - Pascal (z tablicą boolowską)

```pascal
program Wega42;
var f: TextFile; s, najlepsze: String;
maxR, r, i: Integer; uzyte: array['A' 'Z'] of Boolean;
ch: Char;
begin
AssignFile(f, 'sygnaly.txt'); Reset(f);
maxR := 0;
najlepsze := '';
while not Eof(f) do begin
Readln(f, s);
if Length(s) = 0 then Continue;
for ch := 'A' to 'Z' do uzyte[ch] := False;
for i := 1 to Length(s) do uzyte[s[i]] := True;
r := 0;
for ch := 'A' to 'Z' do if uzyte[ch] then r := r + 1;
if r > maxR then begin
maxR := r;
najlepsze := s;
end;
end;
CloseFile(f);
Writeln('4.2 ', najlepsze, ' ', maxR);
end.

## Reference informatyczny - zbiory i unikalność

> Reference - Liczenie unikalnych elementów:
> - **Python**: `set(iterable)` - automatyczna deduplikacja. `len(set(s))` to liczba unikalnych elementów.
> - **C++**: `std::set<char>` - uporządkowany zbiór; `std::unordered_set<char>` - hash-based, szybszy.
> - **Pascal**: tablica boolowska `array['A' 'Z'] of Boolean` lub typ `set of Char`.
> - **Złożoność**: O(L) na słowo, gdzie L = długość słowa.
>
> Reference - Pangram:
> - **Pangram** = tekst zawierający każdą literę alfabetu co najmniej raz.
> - Polski klasyk: "Pchnąć w tę łódź jeża lub ośm skrzyń fig."
> - Angielski klasyk: "The quick brown fox jumps over the lazy dog."
> - W tym zadaniu szukamy słowa-pangramu (lub przybliżającego pangram).
>
> Reference - Tie-breaking (remisy):
> - "Pierwsze pojawiające się" → używamy ostrego `>` (NIE `>=`) przy aktualizacji.
> - Wtedy zmienna `najlepsze` aktualizuje się TYLKO gdy znajdziemy BARDZIEJ unikalne słowo.

## Schemat oceniania CKE

> Klucz CKE (zadanie 4.2, max 4 pkt):
> - **4 pkt** - prawidłowe słowo + liczba 26
> - **2 pkt** - tylko prawidłowe słowo (bez liczby) lub odwrotnie
> - **0 pkt** - błędne lub brak
>
> **Uwaga: NIE PRZYZNAJE SIĘ 3 ani 1 PUNKTU.**

## Typowe pułapki

- **Liczenie wszystkich liter** zamiast unikalnych - wtedy długie słowo wygrywa nawet z powtórzeniami. Trzeba `len(set(s))`, NIE `len(s)`.
- **Operator `>=` zamiast `>`** - wtedy przy remisie wygra OSTATNIE napotkane, a powinniśmy PIERWSZE.
- **Liczenie liter razem ze spacjami/newline** - `s.strip()` przed liczeniem.
- **Pomylenie litery z bajtem** - w UTF-8 polski znak może mieć więcej bajtów. Tu jest tylko angielski A-Z, więc nie problem.
- **Sortowanie liter** - niepotrzebne; zbiór automatycznie deduplikuje.

## Złożoność obliczeniowa

- Dla 1000 słów × max 100 znaków: **O(N · L)** = O(100 000) operacji.
- Pamięć: O(26) (zbiór liter angielskich) per słowo.

## Linki

- [dane JSON](https://matura.lol/api/question/maturazai-informatyka-inf-2018-05/zad/4.2)
- [otwórz w wyszukiwarce](https://matura.lol/?problem=maturazai-informatyka-inf-2018-05%2Fzad%2F4.2)

## Podobne zadania

- [Zadanie 3](https://matura.lol/question/informatyka-2026-maj-matura-rozszerzona/zad/3) — Zadanie 3. Pary slow W pliku tekstowym pary.txt znajduje sie 500 par slow zlozonych z liter alfabetu angielskiego a, b, , z. Kazda para slow jest zapisana w oso
- [Zadanie 2](https://matura.lol/question/informatyka-2026-maj-matura-rozszerzona/zad/2) — Zadanie 2. Dodawanie Rozwazamy dodawanie pisemne dwoch liczb zapisanych w systemie dziesietnym, zilustrowane na przykladzie. Przeniesienie: 1 1 1 1 Liczba a: 2 
- [Zadanie 4.2](https://matura.lol/question/informatyka-2020-lipiec-matura-rozszerzona-2/zad/4.2) — Zadanie 4.2. (0-4) Podaj wszystkie te identyfikatory dokumentów z pliku identyfikator.txt, których seria lub numer są palindromami, czyli czytane od lewej do pr
- [Zadanie 4.2](https://matura.lol/question/informatyka-2018-maj-matura-rozszerzona-2/zad/4.2) — Kontekst - patrz zadanie 4.1. Znajdź słowo, w którym występuje największa liczba **różnych** liter. Wypisz to słowo i liczbę występujących w nim różnych liter. 

_Ostatnia aktualizacja danych: 2026-10-03_
