Advertisement
Guest User

Untitled

a guest
Apr 20th, 2014
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <map>
  5. #include <set>
  6.  
  7. using namespace std;
  8.  
  9. typedef vector<string>::iterator Str_it;
  10. typedef map<string, string>::iterator Map_it;
  11. typedef set<string>::iterator Set_it;
  12.  
  13. void split(vector<string>& s, const string& str, const string& delim) {
  14.     int beg = 0;
  15.     int size = str.size();
  16.     int step = delim.size();
  17.     vector<string> tokens;
  18.  
  19.     while(beg < size) {
  20.         int start = str.find(delim, beg);
  21.         tokens.push_back(str.substr(beg, start - beg));
  22.         if (start == string::npos) break;
  23.         beg = start + step;
  24.     }
  25.     s = tokens;
  26. }
  27.  
  28. string join(set<string>& strings, const string& sep) {
  29.     Set_it it = strings.begin();
  30.     if (it == strings.end()) return "";
  31.     string tmp = *it;
  32.     it++;
  33.     for (; it != strings.end(); it++) {
  34.         tmp += sep;
  35.         tmp += *it;
  36.     }
  37.     return tmp;
  38. }
  39.  
  40. void eps_prijelaz(set<string>& skup, map<string, string>& prijelazi) {
  41.     set<string> nova(skup);
  42.     for (Set_it it = skup.begin(); it != skup.end(); it++) {
  43.         Map_it p = prijelazi.find(*it + ",$");
  44.         if (p == prijelazi.end()) continue;
  45.         vector<string> za_dodat;
  46.         split(za_dodat, p->second, ",");
  47.         for (Str_it it2 = za_dodat.begin(); it2 != za_dodat.end(); it2++) {
  48.             nova.insert(*it2);
  49.         }
  50.     }
  51.     if (nova == skup) {
  52.         return;
  53.     } else {
  54.         skup = nova;
  55.         eps_prijelaz(skup, prijelazi);
  56.     }
  57. }
  58.  
  59. void izvrsi_prijelaze(string& niz, map<string, string>& prijelazi, string& pocetno) {
  60.     vector<string> znakovi;
  61.     split(znakovi, niz, ",");
  62.    
  63.     set<string> trenutna;
  64.     trenutna.insert(pocetno);
  65.     eps_prijelaz(trenutna, prijelazi);
  66.     string ispis;
  67.     if (trenutna.size() == 0) {
  68.         ispis += "#";
  69.     } else {
  70.         ispis += join(trenutna, ",");
  71.     }
  72.  
  73.     for (Str_it it = znakovi.begin(); it != znakovi.end(); it++) {
  74.         set<string> nova;
  75.         for (Set_it it2 = trenutna.begin(); it2 != trenutna.end(); it2++) {
  76.             Map_it p = prijelazi.find(*it2 + "," + *it);
  77.             if (p == prijelazi.end()) continue;
  78.             vector<string> za_dodat;
  79.             split(za_dodat, p->second, ",");
  80.             for (Str_it it3 = za_dodat.begin(); it3 != za_dodat.end(); it3++) {
  81.                 nova.insert(*it3);
  82.             }
  83.         }
  84.  
  85.         eps_prijelaz(nova, prijelazi);
  86.         trenutna = nova;
  87.         trenutna.erase("#");
  88.         if (trenutna.size() == 0) {
  89.             ispis += "|#";
  90.         } else {
  91.             ispis += "|" + join(trenutna, ",");
  92.         }
  93.     }
  94.     cout << ispis << endl;
  95. }
  96.  
  97. int main() {
  98.     string s;
  99.     cin >> s;
  100.     vector<string> ulazni;
  101.     split(ulazni, s, "|");
  102.     string pocetno;
  103.     cin >> s >> s >> s >> pocetno;
  104.     map<string, string> prijelazi;
  105.     while (cin >> s) {
  106.         vector<string> p;
  107.         split(p, s, "->");
  108.         prijelazi.insert(pair<string, string>(p[0], p[1]));
  109.     }
  110.     for (Str_it it = ulazni.begin(); it != ulazni.end(); it++) {
  111.         izvrsi_prijelaze(*it, prijelazi, pocetno);
  112.     }
  113.     return 0;
  114. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement