Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import sys
- sys.setrecursionlimit(50007)
- sys.stdin = open('censored.in', 'r')
- sys.stdout = open('censored.out', 'w')
- #sys.stdin = open('input.txt', 'r')
- #sys.stdout = open('output.txt', 'w')
- n, m, P = map(int, input().split())
- uk = 0
- a = input()
- alph = dict()
- for i in range (len(a)):
- alph[a[i]] = i
- MAXN = 1488
- nxt = []
- p = []
- pr = []
- go = []
- link = []
- dp = []
- was = []
- term = []
- g = []
- #init
- for i in range(MAXN):
- was.append(0)
- nxt.append([])
- go.append([])
- p.append(-1)
- pr.append(-1)
- link.append(-1)
- dp.append([])
- term.append(0)
- g.append([])
- for j in range(107):
- nxt[i].append(-1)
- dp[i].append(0)
- go[i].append(-1)
- dp[0][0] = 1
- def addstr(s):
- global p, pr, nxt, uk
- cur = 0
- for i in range(len(s)):
- let = alph[s[i]]
- if (nxt[cur][let] == -1):
- uk += 1
- nxt[cur][let] = uk
- p[uk] = cur
- pr[uk] = let
- cur = nxt[cur][let]
- term[cur] = 1
- def getsufflink(u):
- global link, p, pr
- if (link[u] == -1):
- if (u == 0 or p[u] == 0):
- link[u] = 0
- else:
- link[u] = getlink(getsufflink(p[u]), pr[u])
- return link[u]
- def getlink(u, c):
- global go, nxt
- if (go[u][c] == -1):
- if (nxt[u][c] != -1):
- go[u][c] = nxt[u][c]
- else:
- if (u == 0):
- go[u][c] = 0
- else:
- go[u][c] = getlink(getsufflink(u), c)
- return go[u][c]
- def markterminal(u):
- was[u] = 1
- if (term[u] == 0):
- if (was[u] == 0):
- markterminal(getsufflink(u))
- term[u] = term[getsufflink(u)]
- for i in range(P):
- s = str(input())
- addstr(s)
- link[0] = 0
- for i in range(uk + 1):
- if (was[i] == 0):
- markterminal(i)
- for i in range(uk + 1):
- if (term[i] == 0):
- for j in range(n):
- to = getlink(i, j)
- if (term[to] == 0):
- g[to].append(i)
- for len in range(m):
- for i in range(uk + 1):
- for j in (g[i]):
- dp[i][len + 1] += dp[j][len]
- ans = 0
- for i in range(uk + 1):
- ans += dp[i][m]
- print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement