Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- #include <map>
- #include <set>
- using namespace std;
- typedef vector<string>::iterator Str_it;
- typedef map<string, string>::iterator Map_it;
- typedef set<string>::iterator Set_it;
- void split(vector<string>& s, const string& str, const string& delim) {
- int beg = 0;
- int size = str.size();
- int step = delim.size();
- vector<string> tokens;
- while(beg < size) {
- int start = str.find(delim, beg);
- tokens.push_back(str.substr(beg, start - beg));
- if (start == string::npos) break;
- beg = start + step;
- }
- s = tokens;
- }
- string join(set<string>& strings, const string& sep) {
- Set_it it = strings.begin();
- if (it == strings.end()) return "";
- string tmp = *it;
- it++;
- for (; it != strings.end(); it++) {
- tmp += sep;
- tmp += *it;
- }
- return tmp;
- }
- void eps_prijelaz(set<string>& skup, map<string, string>& prijelazi) {
- set<string> nova(skup);
- for (Set_it it = skup.begin(); it != skup.end(); it++) {
- Map_it p = prijelazi.find(*it + ",$");
- if (p == prijelazi.end()) continue;
- vector<string> za_dodat;
- split(za_dodat, p->second, ",");
- for (Str_it it2 = za_dodat.begin(); it2 != za_dodat.end(); it2++) {
- nova.insert(*it2);
- }
- }
- if (nova == skup) {
- return;
- } else {
- skup = nova;
- eps_prijelaz(skup, prijelazi);
- }
- }
- void izvrsi_prijelaze(string& niz, map<string, string>& prijelazi, string& pocetno) {
- vector<string> znakovi;
- split(znakovi, niz, ",");
- set<string> trenutna;
- trenutna.insert(pocetno);
- eps_prijelaz(trenutna, prijelazi);
- string ispis;
- if (trenutna.size() == 0) {
- ispis += "#";
- } else {
- ispis += join(trenutna, ",");
- }
- for (Str_it it = znakovi.begin(); it != znakovi.end(); it++) {
- set<string> nova;
- for (Set_it it2 = trenutna.begin(); it2 != trenutna.end(); it2++) {
- Map_it p = prijelazi.find(*it2 + "," + *it);
- if (p == prijelazi.end()) continue;
- vector<string> za_dodat;
- split(za_dodat, p->second, ",");
- for (Str_it it3 = za_dodat.begin(); it3 != za_dodat.end(); it3++) {
- nova.insert(*it3);
- }
- }
- eps_prijelaz(nova, prijelazi);
- trenutna = nova;
- trenutna.erase("#");
- if (trenutna.size() == 0) {
- ispis += "|#";
- } else {
- ispis += "|" + join(trenutna, ",");
- }
- }
- cout << ispis << endl;
- }
- int main() {
- string s;
- cin >> s;
- vector<string> ulazni;
- split(ulazni, s, "|");
- string pocetno;
- cin >> s >> s >> s >> pocetno;
- map<string, string> prijelazi;
- while (cin >> s) {
- vector<string> p;
- split(p, s, "->");
- prijelazi.insert(pair<string, string>(p[0], p[1]));
- }
- for (Str_it it = ulazni.begin(); it != ulazni.end(); it++) {
- izvrsi_prijelaze(*it, prijelazi, pocetno);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement