Advertisement
IzhanVarsky

Untitled

May 3rd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.66 KB | None | 0 0
  1. #include <fstream>
  2. //#include <iostream>
  3. #include <vector>
  4. #include <set>
  5. #include <map>
  6. #include <queue>
  7. #include <string>
  8.  
  9. using namespace std;
  10. vector<vector<pair<int, int>>> aut; // aut[a] - из какого состояния; .first - в какое; .second - по какому символу
  11. vector<bool> isTermin;
  12. map<set<int>, vector<set<int>>> new_aut_with_sets; // new_aut[a][b] - переход из состояния a в b
  13. map<set<int>, bool> new_isTermin_with_sets;
  14. map<set<int>, map<int,int>> memoize;
  15.  
  16. int ans(const set<int>& curSost, int rest) {
  17. if (memoize[curSost].count(rest) != 0) {
  18. return memoize[curSost][rest];
  19. }
  20. int* cur = &memoize[curSost][rest];
  21. if (rest == 0) {
  22. *cur = (new_isTermin_with_sets[curSost]) ? 1 : 0;
  23. return *cur;
  24. }
  25. *cur = 0;
  26. for (const auto& next : new_aut_with_sets[curSost]) {
  27. *cur += ans(next, rest - 1);
  28. *cur %= 1000000007;
  29. }
  30. return *cur;
  31. }
  32.  
  33. void getNewAut() {
  34. queue<set<int>> P;
  35. set<set<int>> Qd; // запоминает уже использованные множества
  36. P.push({1});
  37. Qd.insert({1});
  38. new_isTermin_with_sets[{1}] = isTermin[1];
  39. while (!P.empty()) {
  40. auto popped = P.front();
  41. P.pop();
  42. for (int i = 0; i < 26; ++i) {
  43. set<int> qd;
  44. for (int j : popped) { // бежим по удаленному из очереди множеству состояний
  45. for (auto z : aut[j]) { // получаем пары - в какое состояние по какому символу
  46. if (z.second == i) {
  47. qd.insert(z.first);
  48. }
  49. }
  50. }
  51. if (qd.empty()) continue;
  52. if (Qd.count(qd) == 0) {
  53. P.push(qd);
  54. Qd.insert(qd);
  55. for (int j : qd) {
  56. if (isTermin[j]) {
  57. new_isTermin_with_sets[qd] = true;
  58. break;
  59. }
  60. }
  61. }
  62. new_aut_with_sets[popped].push_back(qd);
  63. }
  64. }
  65. }
  66.  
  67. int main() {
  68. int n, m, k, len;
  69. ifstream cin("problem5.in");
  70. ofstream cout("problem5.out");
  71. cin >> n >> m >> k >> len;
  72. isTermin.resize(n + 1);
  73. aut.resize(n + 1);
  74. int a, b;
  75. char c;
  76. for (int i = 0; i < k; ++i) {
  77. cin >> a;
  78. isTermin[a] = true;
  79. }
  80. for (int i = 0; i < m; ++i) {
  81. cin >> a >> b >> c;
  82. aut[a].push_back(make_pair(b, c - 'a'));
  83. }
  84. getNewAut();
  85. cout << ans({1}, len);
  86. return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement