Guest User

Untitled

a guest
Dec 12th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.94 KB | None | 0 0
  1. import java.io.*;
  2. import java.security.AlgorithmConstraints;
  3. import java.util.*;
  4.  
  5. public class Problem5 {
  6. MyScanner input;
  7. PrintWriter output;
  8.  
  9. class MyScanner {
  10. public BufferedReader input;
  11. private String buffer = "";
  12. private int bufPointer = 0;
  13.  
  14. public MyScanner(String file) throws Exception {
  15. input = new BufferedReader(new FileReader(file));
  16. buffer = input.readLine();
  17. }
  18.  
  19. private boolean readNewBuf() throws IOException {
  20. if (bufPointer >= buffer.length()) {
  21. bufPointer = 0;
  22. buffer = input.readLine();
  23. return true;
  24. }
  25. return false;
  26. }
  27.  
  28. public String nextLine() throws Exception {
  29. while (readNewBuf()) {
  30. }
  31. if (bufPointer == 0) {
  32. String temp = buffer;
  33. bufPointer = buffer.length();
  34. readNewBuf();
  35. return temp;
  36. } else {
  37. String temp = "";
  38. for (; bufPointer < buffer.length(); bufPointer++) {
  39. temp += buffer.charAt(bufPointer);
  40. }
  41. readNewBuf();
  42. return temp;
  43. }
  44. }
  45.  
  46. public int nextInt() throws Exception {
  47. readNewBuf();
  48. while (buffer.charAt(bufPointer) == ' ') {
  49. bufPointer++;
  50. readNewBuf();
  51. }
  52.  
  53. int res = 0, plus = 1;
  54. if (buffer.charAt(bufPointer) == '-') {
  55. plus = -1;
  56. bufPointer++;
  57. }
  58.  
  59. while (bufPointer < buffer.length()
  60. && buffer.charAt(bufPointer) >= '0'
  61. && buffer.charAt(bufPointer) <= '9') {
  62. res = res * 10 + buffer.charAt(bufPointer) - '0';
  63. bufPointer++;
  64. }
  65.  
  66. return res * plus;
  67. }
  68.  
  69. public char nextChar() throws Throwable {
  70. readNewBuf();
  71. while (buffer.charAt(bufPointer) == ' ') {
  72. bufPointer++;
  73. readNewBuf();
  74. }
  75.  
  76. char res = buffer.charAt(bufPointer);
  77. bufPointer++;
  78. return res;
  79. }
  80. }
  81.  
  82. private static final int ALPHABIT = 'z' - 'a' + 1;
  83.  
  84. static class Vertex {
  85. boolean term;
  86. long[] words;
  87.  
  88. List<Integer>[] edges = (LinkedList<Integer>[]) new LinkedList[AS];
  89.  
  90. Vertex() {
  91. for (int i = 0; i < ALPHABIT; i++) {
  92. edges[i] = new LinkedList<Integer>();
  93. }
  94. }
  95.  
  96.  
  97. }
  98.  
  99. static class NewVertex {
  100. public boolean term = false;
  101. public int num;
  102. public int[] edges = new int[ALPHABIT];
  103. public Set<Integer> name;
  104. public long[] words;
  105.  
  106. public NewVertex(Set<Integer> name, int l, int num) {
  107. this.name = name;
  108. this.num = num;
  109.  
  110. words = new long[l + 1];
  111. }
  112.  
  113. public void add(int num, char by) {
  114. edges[by - 'a'] = by;
  115. }
  116.  
  117. @Override
  118. public boolean equals(Object o) {
  119. if (o instanceof NewVertex) {
  120. return name.equals(((NewVertex) o).name);
  121. }
  122.  
  123. return false;
  124. }
  125. }
  126.  
  127. private void solve() throws Throwable {
  128. int n = input.nextInt();
  129. int m = input.nextInt();
  130. int k = input.nextInt();
  131. int l = input.nextInt();
  132.  
  133. Vertex[] vert = new Vertex[n];
  134. for (int i = 0; i < n; i++) {
  135. vert[i] = new Vertex();
  136. }
  137.  
  138. for (int i = 0; i < k; i++) {
  139. vert[input.nextInt() - 1].term= true;
  140. }
  141.  
  142. int a, b;
  143. char c;
  144. for (int i = 0; i < m; i++) {
  145. a = input.nextInt() - 1;
  146. b = input.nextInt() - 1;
  147. c = input.nextChar();
  148.  
  149. vert[a].add(b, c);
  150. }
  151.  
  152. Queue<Set<Integer>> Q = new LinkedList<Set<Integer>>();
  153. LinkedList<Integer> from = new LinkedList<Integer>();
  154. LinkedList<Character> by = new LinkedList<Character>();
  155.  
  156.  
  157. ArrayList<NewVertex> newQ = new ArrayList<NewVertex>();
  158. int num = 0;
  159. Set<Integer> temp = new HashSet<Integer>();
  160. temp.add(0);
  161. from.add(-1);
  162. by.add('0');
  163. Q.add(temp);
  164.  
  165. while (!Q.isEmpty()) {
  166.  
  167. Set<Integer> qd_Q = Q.poll();
  168. int qd_from = from.poll();
  169. char qd_by = by.poll();
  170. newQ.add(new NewVertex(qd_Q, l, num));
  171.  
  172. if (qd_from != -1 ) {
  173. newQ.get(qd_from).add(num, qd_by);
  174. }
  175.  
  176. num++;
  177.  
  178. for (int i = 0; i < ALPHABIT; i++) {
  179. Set<Integer> pd = new HashSet<Integer>();
  180.  
  181. for (int q : qd_Q) {
  182. pd.addALL(vertexes[q].edges[i]);
  183. }
  184.  
  185. while(!pd.isEmpty()) {
  186. NewVertex v = new NewVertex(pd, -1, -1);
  187. if (newQ.contains(v)) {
  188. int to = newQ.indexOf(v);
  189. newQ.get(num - 1).edges[i] = to;
  190. } else {
  191. Q.add(pd);
  192. from.add(num - 1);
  193. char nn = (char)('a' + i);
  194. by.add(nn);
  195. }
  196. }
  197. }
  198. }
  199. for (NewVertex v : newQ) {
  200. boolean ans = false;
  201. for (int i: v.name) {
  202. if (vertexes[i].term) {
  203. ans = true;
  204. break;
  205. }
  206. }
  207. v.term = ans;
  208. }
  209.  
  210. newQ.get(0).words[0] = 1;
  211.  
  212.  
  213.  
  214. for (NewVertex v: newQ) {
  215. for (int i = 0; i < ALPHABIT; i++) {
  216. if (newQ.get(v).edges[i] != -1) {
  217. int u = newQ.get(v).edges[i];
  218. newQ.get(u).words[length] = (newVert.get(u).words[length] + newQ.get(v).words[length - 1]) % 1000000007;
  219. }
  220. }
  221. }
  222.  
  223.  
  224. long result = 0;
  225.  
  226. for (int i = 0; i < newQ.size(); i++) {
  227. if (newQ.get(i).term) {
  228. result = (result + Math.max(newQ.get(i).words[l], 0)) % 1000000007;
  229. }
  230. }
  231.  
  232. output.println(result);
  233. }
  234.  
  235.  
  236. private void run() throws Throwable {
  237. try {
  238. solve();
  239. } finally {
  240. }
  241. }
  242.  
  243. public Problem5() throws Exception {
  244. input = new MyScanner("problem5.in");
  245. output = new PrintWriter("problem5.out");
  246. }
  247.  
  248. public static void main(String[] args) throws Throwable {
  249. new Problem5().run();
  250. }
  251.  
  252. }
Add Comment
Please, Sign In to add comment