Cod sursa(job #2583237)

Utilizator fminostress9FMI No Stress 9 fminostress9 Data 17 martie 2020 22:23:30
Problema NFA Scor Ascuns
Compilator cpp-64 Status done
Runda Marime 1.17 kb
#include <bits/stdc++.h>

using namespace std;
using Bitset = bitset<512>;

int main() {
  ifstream cin("nfa.in");
  ofstream cout("nfa.out");

  int n, m, k; cin >> n >> m >> k;
  assert(1 <= n && n <= 300); 
  assert(1 <= m && m <= 1200);
  assert(1 <= k && k <= n);

  vector<vector<Bitset>> graph(n, vector<Bitset>(26));

  Bitset fini;
  int x; cin >> x; --x;
  assert(0 <= x && x < n);
  while (k--) {
    int x; cin >> x; --x;
    assert(0 <= x && x < n);
    fini[x] = true;
  }

  for (int i = 0; i < m; ++i) {
    int a, b; char c; cin >> a >> b >> c;
    --a; --b;
    assert(0 <= a && a < n);
    assert(0 <= b && b < n);
    assert('a' <= c && c <= 'z');
    graph[a][c - 'a'][b] = true;
  }
  int q; cin >> q;
  assert(1 <= q && q <= 100);
  while (q--) {
    string s; cin >> s;
    assert(1 <= s.size() && s.size() <= 50);
    Bitset now; now[x] = true;
    for (auto c : s) {
      Bitset nxt;
      assert('a' <= c && c <= 'z');
      for (int i = 0; i < n; ++i) 
        if (now[i]) nxt |= graph[i][c - 'a'];
      swap(now, nxt);
    }
    now &= fini;
    bool ok = false;
    for (int i = 0; i < n; ++i) 
      if (now[i]) ok = true;
    cout << ok << '\n';
  }
  return 0;
}