Guest User

Untitled

a guest
Jan 25th, 2013
366
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.45 KB | None | 0 0
  1. #include <string>
  2. #include <iostream>
  3. #include <fstream>
  4. #include <vector>
  5. #include <map>
  6. #include <cctype>
  7.  
  8. using namespace std;
  9.  
  10. typedef map<string, vector<size_t>> slovnik;
  11. typedef vector<size_t> mezery;
  12.  
  13. struct Slovnik {
  14. public:
  15.     void nactiSe(ifstream &ins) {
  16.         while(!ins.eof()) { // pro kazde slovo
  17.             string slovo;
  18.             ins >> slovo;
  19.             mezery aktualniMezery;
  20.             size_t pocetPismen = 0;
  21.             string aktualniSlovo = "";
  22.             for(size_t i = 0; i < slovo.length(); ++i) {
  23.                 char c = slovo[i];
  24.                 if (c == '-') {
  25.                     aktualniMezery.push_back(pocetPismen);
  26.                 } else {
  27.                     aktualniSlovo += c;
  28.                     ++pocetPismen;
  29.                 }
  30.             }
  31.             pridejSlovo(aktualniSlovo, aktualniMezery);
  32.         }
  33.     }
  34.     slovnik S;
  35.     void pridejSlovo(const string &slovo, const mezery &m) {
  36.         S[slovo] = m;
  37.     }
  38.     mezery mezerySlova(const string &slovo) {
  39.         S.find(slovo);
  40.         if (S.find(slovo) != S.end())
  41.             return S.find(slovo)->second;
  42.         else
  43.             return mezery();
  44.  
  45.     }
  46. };
  47.  
  48. int vypisSlovo(const string &slovo, int sirka, int zbyva, int pocetVypsanych, ofstream &out, Slovnik &slovnik) { // vraci pocet zbyvajicich znaku
  49.     int zbyvalo = zbyva;
  50.     zbyva -= slovo.length() - pocetVypsanych;
  51.     if (zbyva >= 0) {// slovo lze normalne vypsat .. ani se nemusim koukat do slovniku
  52.         out << string(slovo,pocetVypsanych,slovo.length()) << ' ';
  53.         --zbyva;
  54.     } else { // nejde vypsat
  55.         mezery aktualniMezery = slovnik.mezerySlova(slovo);
  56.         if (aktualniMezery.size() == 0 || (int)aktualniMezery.at(aktualniMezery.size()-1) <= pocetVypsanych) { // nejde vypsat, neni ve slovniku .. vypis na novou radku
  57.             out  << string(slovo,pocetVypsanych,slovo.length()) << ' ';
  58.             zbyva = sirka - string(slovo,pocetVypsanych,slovo.length()).length() - 1;
  59.         } else { // slovo je ve slovniku -> deleni
  60.  
  61.             int nejlepsiDeleni = 0;
  62.  
  63.             for (size_t i = 0; i < aktualniMezery.size(); ++i) { // nejdelsi mozde oddeleni slova
  64.                 if ((int)aktualniMezery.at(i) + 1 <= zbyvalo) {
  65.                     nejlepsiDeleni = (int)aktualniMezery.at(i);
  66.                 }
  67.             }
  68.  
  69.             if (nejlepsiDeleni <= pocetVypsanych) { // pokud uz je cast slova vypsana, muzu delit az za vypsanou casti
  70.                 for (size_t i = 0; i < aktualniMezery.size(); ++i) {
  71.                     if (pocetVypsanych < (int)aktualniMezery.at(i)) {
  72.                         nejlepsiDeleni = (int)aktualniMezery.at(i);
  73.                         break;
  74.                     }
  75.                 }
  76.             }
  77.  
  78.             if (nejlepsiDeleni + 1 <= zbyvalo) { // vypis rozdeleneho slova
  79.                 out << string(slovo,pocetVypsanych,nejlepsiDeleni)<< "-\n";
  80.                 pocetVypsanych = nejlepsiDeleni;
  81.                 zbyva = sirka;
  82.                 return vypisSlovo(slovo, sirka, zbyva, pocetVypsanych, out, slovnik);
  83.  
  84.             } else { // ani slovo ze slovniku nelze momentalne rozdelit
  85.                 if (zbyvalo == sirka) {
  86.                     out << string(slovo,pocetVypsanych,slovo.length()) << "\n";
  87.                     return sirka;
  88.                 } else { // zkusime ho dat na novou radku
  89.                     out << "\n";
  90.                     zbyva = sirka;
  91.                     return vypisSlovo(slovo, sirka, zbyva, pocetVypsanych, out, slovnik);
  92.                 }
  93.             }
  94.         }
  95.  
  96.     }
  97.     if (zbyva <= 1) {
  98.         out << "\n";
  99.         zbyva = sirka;
  100.     }
  101.  
  102.     return zbyva;
  103.  
  104. }
  105.  
  106. int main(int argc, char **argv) {
  107.     string vstupFile("input.txt"); string slovnikFile("slovnik.txt"); string vystupFile("output.txt");
  108.     size_t sirka = 3;
  109.  
  110.     ifstream in(vstupFile);
  111.     ifstream ins(slovnikFile);
  112.  
  113.     Slovnik slovnik;
  114.     slovnik.nactiSe(ins);
  115.     ins.close();
  116.  
  117.     ofstream out(vystupFile);
  118.     int zbyva = sirka;
  119.     while(!in.eof()) {
  120.         string slovo;
  121.         in >> slovo;
  122.         zbyva = vypisSlovo(slovo, sirka, zbyva, 0, out, slovnik);
  123.     }
  124.     in.close();
  125.     out.close();
  126.  
  127. }
Advertisement
Add Comment
Please, Sign In to add comment