Budka Suflera Spoj

0

Witam,

Rozwiązuję zadanie "Budka Suflera"ze spoja (link: https://pl.spoj.com/problems/MWP8_1B/ ) Zostało zaakceptowane przez sędziego ale patrząc na wynik w całości nie wydaje się to być optymalne rozwiązanie. Na ideone.com od razu wyrzuca mi komunikat o przekroczeniu limitu czasu. Czy mogę Was prosić o wskazówki co mogłabym zmienić/polepszyć w kodzie aby był szybszy? Dopiero zaczynam naukę z programowaniem :)


#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

using namespace std;

vector<string> writeText();
vector<string> checkMissedWords(vector<string> songText, vector<string> rememberedText);
void sortAlfabeticlly(vector<string> &missedWords);
void displayWords(vector<string> &missedWords);

int main()
{

    vector<string> songText;
    vector<string> rememberedText;
    vector<string> missedWords;

    songText = writeText();
    rememberedText = writeText();
    missedWords = checkMissedWords(songText, rememberedText);
    sortAlfabeticlly(missedWords);
    displayWords(missedWords);

    return 0;
}

vector<string> writeText(){

    vector<string> writtenText;
    string text;

    do
    {
        cin>>text;
        writtenText.push_back(text);

    }while(cin.get() != '\n');

    return writtenText;
}

vector<string> checkMissedWords(vector<string> songText, vector<string> rememberedText){

for(int i = 0; i < rememberedText.size(); i++){
        for(int j = 0; j < songText.size(); j++){
            if(rememberedText[i] == songText[j]){
                songText.erase(songText.begin() + j);
                break;
            }
            continue;
        }
    }
    return songText;
}


void sortAlfabeticlly(vector<string> &missedWords){

    sort(missedWords.begin(), missedWords.end());
}

void displayWords(vector<string> &missedWords){

    cout << missedWords.size() << endl;
    for(unsigned i = 0; i < missedWords.size(); i++)
        cout<<missedWords[i]<<endl;
}

1
  1. w przypadku argumentów funkcji przekazuj std::vector<std::string> przez stałą referencję
  2. zmień algorytm tak by nie modyfikować wektora songText, usuwanie danych ze środka vector jest bardzo kosztowne
  3. ta podwójna pętla for czyni twój algorytm bardzo powolnym (ma dużą złożoność czasową). Jeśli Krzysztof nie ma sklerozy, a piosenka ma 50 słów to twój kod wykona 250 porównań (200 zbędnych porównań). Czyli masz złożoność O(n^2) a powinieneś mieć O(n).

Treść zadanie nie mówi nic o duplikatach. Np:

JOLKA JOLKA PAMIETASZ LATO ZE SNU
PAMIETASZ ZE SNU

Co powinno być wypisane?

1 użytkowników online, w tym zalogowanych: 0, gości: 1