Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <string>
- #include <iostream>
- #include <fstream>
- #include <vector>
- #include <map>
- #include <cctype>
- using namespace std;
- typedef map<string, vector<size_t>> slovnik;
- typedef vector<size_t> mezery;
- struct Slovnik {
- public:
- void nactiSe(ifstream &ins) {
- while(!ins.eof()) { // pro kazde slovo
- string slovo;
- ins >> slovo;
- mezery aktualniMezery;
- size_t pocetPismen = 0;
- string aktualniSlovo = "";
- for(size_t i = 0; i < slovo.length(); ++i) {
- char c = slovo[i];
- if (c == '-') {
- aktualniMezery.push_back(pocetPismen);
- } else {
- aktualniSlovo += c;
- ++pocetPismen;
- }
- }
- pridejSlovo(aktualniSlovo, aktualniMezery);
- }
- }
- slovnik S;
- void pridejSlovo(const string &slovo, const mezery &m) {
- S[slovo] = m;
- }
- mezery mezerySlova(const string &slovo) {
- S.find(slovo);
- if (S.find(slovo) != S.end())
- return S.find(slovo)->second;
- else
- return mezery();
- }
- };
- int vypisSlovo(const string &slovo, int sirka, int zbyva, int pocetVypsanych, ofstream &out, Slovnik &slovnik) { // vraci pocet zbyvajicich znaku
- int zbyvalo = zbyva;
- zbyva -= slovo.length() - pocetVypsanych;
- if (zbyva >= 0) {// slovo lze normalne vypsat .. ani se nemusim koukat do slovniku
- out << string(slovo,pocetVypsanych,slovo.length()) << ' ';
- --zbyva;
- } else { // nejde vypsat
- mezery aktualniMezery = slovnik.mezerySlova(slovo);
- if (aktualniMezery.size() == 0 || (int)aktualniMezery.at(aktualniMezery.size()-1) <= pocetVypsanych) { // nejde vypsat, neni ve slovniku .. vypis na novou radku
- out << string(slovo,pocetVypsanych,slovo.length()) << ' ';
- zbyva = sirka - string(slovo,pocetVypsanych,slovo.length()).length() - 1;
- } else { // slovo je ve slovniku -> deleni
- int nejlepsiDeleni = 0;
- for (size_t i = 0; i < aktualniMezery.size(); ++i) { // nejdelsi mozde oddeleni slova
- if ((int)aktualniMezery.at(i) + 1 <= zbyvalo) {
- nejlepsiDeleni = (int)aktualniMezery.at(i);
- }
- }
- if (nejlepsiDeleni <= pocetVypsanych) { // pokud uz je cast slova vypsana, muzu delit az za vypsanou casti
- for (size_t i = 0; i < aktualniMezery.size(); ++i) {
- if (pocetVypsanych < (int)aktualniMezery.at(i)) {
- nejlepsiDeleni = (int)aktualniMezery.at(i);
- break;
- }
- }
- }
- if (nejlepsiDeleni + 1 <= zbyvalo) { // vypis rozdeleneho slova
- out << string(slovo,pocetVypsanych,nejlepsiDeleni)<< "-\n";
- pocetVypsanych = nejlepsiDeleni;
- zbyva = sirka;
- return vypisSlovo(slovo, sirka, zbyva, pocetVypsanych, out, slovnik);
- } else { // ani slovo ze slovniku nelze momentalne rozdelit
- if (zbyvalo == sirka) {
- out << string(slovo,pocetVypsanych,slovo.length()) << "\n";
- return sirka;
- } else { // zkusime ho dat na novou radku
- out << "\n";
- zbyva = sirka;
- return vypisSlovo(slovo, sirka, zbyva, pocetVypsanych, out, slovnik);
- }
- }
- }
- }
- if (zbyva <= 1) {
- out << "\n";
- zbyva = sirka;
- }
- return zbyva;
- }
- int main(int argc, char **argv) {
- string vstupFile("input.txt"); string slovnikFile("slovnik.txt"); string vystupFile("output.txt");
- size_t sirka = 3;
- ifstream in(vstupFile);
- ifstream ins(slovnikFile);
- Slovnik slovnik;
- slovnik.nactiSe(ins);
- ins.close();
- ofstream out(vystupFile);
- int zbyva = sirka;
- while(!in.eof()) {
- string slovo;
- in >> slovo;
- zbyva = vypisSlovo(slovo, sirka, zbyva, 0, out, slovnik);
- }
- in.close();
- out.close();
- }
Advertisement
Add Comment
Please, Sign In to add comment