Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <set>
- #include <map>
- #include <string>
- using namespace std;
- const string END = "END";
- multimap<string, string> automata;
- string end_state;
- int end_num = 0;
- bool rec(const string& input, const string::iterator& it, const string& cur)
- {
- if(it == input.end()){
- end_state = cur;
- end_num = it - input.begin();
- return true;
- }
- auto s = automata.find(cur + " ");
- if(s != automata.end()){
- if(rec(input, it, s->second)){
- return true;
- }
- }
- auto range = automata.equal_range(cur + *it);
- for(auto i = range.first; i != range.second; ++i){
- if(rec(input, it+1, i->second)){
- return true;
- }
- }
- if(it - input.begin() > end_num){
- end_num = it - input.begin();
- }
- return false;
- }
- int main()
- {
- string from, to;
- string ch;
- while(cin >> from, from != END){
- cin >> ch >> to;
- if(ch == "eps"){
- from += " ";
- } else {
- from += ch;
- }
- automata.insert(make_pair(from, to));
- }
- set<string> end_states;
- string state;
- while(cin >> state, state != END){
- end_states.insert(state);
- }
- string cur, input;
- cin >> cur >> input;
- bool ok = rec(input, input.begin(), cur);
- int result = ok && end_states.find(end_state) != end_states.end();
- cout << result << endl;
- cout << end_num << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement