package chelper; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import io.InputReader; import io.OutputWriter; import misc.GCJSolution; public class TaskC extends GCJSolution { private int[] s; private int n; private Set lengths; private HashMap, Integer> masks; private String[] wordsS; private int wordCount; public void solve(int testNumber, InputReader in, OutputWriter out) { wrapSolve(testNumber, in, out); } long mod = 1000000007L; long base = 31; long[] bases = new long[30]; { bases[0] = 1; for (int i = 1; i < 30; i++) { bases[i] = bases[i - 1] * base % mod; } } ArrayList maskl(int[] mask) { ArrayList res = new ArrayList<>(); for (int i : mask) { res.add(i); } return res; } @Override public void solve(int testNumber) { wordCount = in.nextInt(); wordsS = in.nextStringArray(wordCount); // Map> lenToHashes = new HashMap<>(); masks = new HashMap<>(); lengths = new HashSet<>(); for (String s : wordsS) { int l = s.length(); lengths.add(l); // lenToHashes.putIfAbsent(l, new ArrayList<>()); int[] mask = new int[30]; for (int i = 0; i < l; i++) { int c = s.charAt(i) - 97; mask[c]++; } mask[26] = s.charAt(0) - 97; mask[27] = s.charAt(l - 1) - 97; mask[28] = l; ArrayList maskl = maskl(mask); masks.putIfAbsent(maskl, 0); masks.put(maskl, masks.get(maskl) + 1); } long s1 = in.nextString().charAt(0); long s2 = in.nextString().charAt(0); n = in.nextInt(); s = new int[n]; { long a = in.nextInt(); long b = in.nextInt(); long c = in.nextInt(); long d = in.nextInt(); s[0] = (int) s1; s[1] = (int) s2; for (int i = 2; i < n; i++) { s[i] = (int) ((a * s[i - 1] + b * s[i - 2] + c) % d); } for (int i = 0; i < n; i++) { if (i < 2) { s[i] -= 97; } s[i] %= 26; } } int sol1 = sol1(); // int sol2 = sol2(); int sol2 = sol1; // out.println(sol1); if (sol1 != sol2) { out.println("!!!!!!!!!!"); out.println(sol1); out.println(sol2); } else { out.println(sol1); } } int sol1() { HashMap, Integer> masks = new HashMap<>(this.masks); int t = 0; for (int l : lengths) { ArrayList a = new ArrayList<>(); for (int i = 0; i < 30; i++) { a.add(0); } for (int i = 0; i < l; i++) { a.set(s[i], a.get(s[i]) + 1); } a.set(28, l); for (int i = 0; i < n; i++) { a.set(26, s[i]); a.set(27, s[i + l - 1]); if (masks.containsKey(a)) { t += masks.get(a); masks.remove(a); } if (i + l >= n) { break; } a.set(s[i], a.get(s[i]) - 1); a.set(s[i + l], a.get(s[i + l]) + 1); } } return t; } int sol2() { char[] s2 = new char[n]; for (int i = 0; i < n; i++) { s2[i] = (char) (s[i] + 97); } String s = new String(s2); int t = 0; for (String i : wordsS) { if (s.contains(i)) { t++; } } return t; } }