To właśnie jest błąd - przeczytaj dokładnie treść zadania, no i czy w końcu dolary nie powinny być traktowane jakoś specjalnie, a na pewno chyba nie niepowinny być usuwane?? 
Stringi są indeksowane od 0 do length() -1 - a to masz chyba w każdej pętli źle.
Opakowanie wywołania jednej funkcji wywołaniem swojej, [która nie wnosi wartości dodanej
] tylko gmatwa i robi mniej czytelnym program-kod:
Mówię o: cin >> n >> tekst;
Jeżeli chcesz ułatwić pomagającym znalezienie błędu, to warto oczyścić kod z niepotrzebnych śmieci np:
void wypisz()...
i jednak to co w main jest niepotrzebne. Jeżeli i tak się nie wywołuje to jak ma niby wykrywać błędy?
Nazwa funkcji [czy zmiennych] powinna być adekwatna do tego co robi. Ułatwia to czytanie i rozumienie co się dzieje:
Np zamiast sprawdzDlugosc() czy nie fajniej byłoby np: drukujGdyOk
Zmienne globalne:
int n;
int dlugosc=0;
int k=0;
bool czyZmienic=false;
string tekst;
Połowa to niepotrzebne śmieci [a dokładnie dwie z pięciu]. Pomysł nazwania długości dlugosc'ą był dobry, ale realizacja [n]?
4.
i-- jest bardzo kiepskim pomysłem. To nie usunie Ci i.
Ciut lepszym jest j-- ale to i tak nie jest dalej w dobrym stylu programowania - to taka swego rodzaju proteza, chociaż aby otrzymać 100 twoim kodem, to też tak zrobiłem. Swoją drogą, [i i j] wszędzie są to zmienne lokalne pętli czy funkcji, więc wszędzie tam możnaby spokojnie i konsekwentnie używać tylko i.
Nadmiernie "piętrowe" wywoływania funkcji powinieneś ograniczyć do niezbędnego minimum, np:
void usunZnak(int j)
{
tekst.erase(j,1);
if(tekst.length() <= dlugosc)
{
cout << tekst << endl;
exit(0);
}
}
Ale wtedy warto zmienić nazwę funkcji na adekwatną.
Taki poprawiony [ale dopiero wtedy] kod możnaby ewentualnie spróbować "zapakować" do jakiejść fajnie i adekwatnie nazwanej klasy.