Jednym ze sposobów optymalizacji która zadzaiłą dla bardzo dużej ilości danych będize drzewo (to się chyba nazywa drzewo słownikowe) - spróbuję przybliżyć ideę chociaż to może być trudne. Masz więc strukturę drzewa, coś w stylu:
struct tree {
int k;
tree *next[32];
}
masz w niej wskaźniki next, jest ich 32 bo są 32 litery w polskim alfabecie. Szukając danego słowa po prostu idziesz po kolei po jego literach czyli np. ala to będzie root, root->next[0] (bo a jest 0 literą), root->next[0]->next[14] (bo l jest jak dobrze policzyłem 14 literą licząc od 0) root->next[0]->next[15]->next[0] (i na końcu znowu a). Oczywiście nie budujesz całego drzewa o wysokości 20 bo to by było strasznie pamięcio i czaso chłonne. Potrzebujesz dwóch operacji - dodawania słowa i szukania słowa. Będą one wyglądały tak: dodawanie słowa - jak dany węzeł z literką istnieje to w niego wchodzisz, jeżeli nie istnieje to go tworzysz. Zauważ że im więcej słów będzie już zrobione, tym mniej nowych węzłów trzeba bedzie tworzyć a jednocześnie będziesz miał tyle węzłów ile potrzebujesz. W tej strukturze jest też zmienna int k - domyślnie ma ona wartość 0, jeżeli na danej literce będzie kończyło się jakieś słowo to po prostu zwiększasz tę wartość o 1, bo np. słowo masa zawiera się w tym drzewie w słowie masakra. Jak więc wspomniałem przez to zawieranie złożoność pamięciowa i czasowa dodawania powinna być w miarę ok, za to złożoność wyszukiwania będzie wręcz cudowna, ponieważ wystarczy iść w dół drzewa wchodząć odpowiednie węzły, jak dojdziemy do końca drzewa (do wskaźnika na NULL) lub wartoś k będzie równa 0 to takiego słowa nie ma w tekście, jak będzie niezerowa to tyle razy to słowo występuje.
Innym sposobem jest tablica z hashowaniem - idea jest taka że masz tablicę n elementów (n musi być dosyć dużę, jest to tablica wskaźników na stringi (w C++ stringi w C albo na strukturę albo na tablicę charów) i teraz każde słowo "przerabiasz na liczbę" - jest to ardzo proste bo wystarczy dodać so siebie kody ASCII liter tego słowa i zrobić modulo n - będzie to klucz. Teraz wystarczy dodać to słowo do tablicy pod indeksem równym kluczowi. Zauważ ze wyszukiwanie będzie polegało na znalezieniu klucza i sporawdzenie czy pod indeksem mu równym coś jest, co jest bardzo szybkie. Oczywiście pozostaje problem że słowa mogą mieć taki sam klucz np. olo i lol - ten problem można rozwiązać jak dana komórka tablicy będzie wskaźnikiem na listę (łańcuch odsyłaczowy) a w niej będą słowa o takich dsamych kluczach (i ew. liczba ich wystąpień w tekście).
Są to dwa sposoby, generalnie troszkę zabawy z zakodzeniem tego będzie, ale oba są szybkie.