Advertisement
K_Y_M_bl_C

Untitled

Feb 21st, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.10 KB | None | 0 0
  1. import sys
  2.  
  3. sys.setrecursionlimit(50007)
  4. sys.stdin = open('censored.in', 'r')
  5. sys.stdout = open('censored.out', 'w')
  6. #sys.stdin = open('input.txt', 'r')
  7. #sys.stdout = open('output.txt', 'w')
  8.  
  9. n, m, P = map(int, input().split())
  10.  
  11. uk = 0
  12.  
  13. a = input()
  14.  
  15. alph = dict()
  16.  
  17. for i in range (len(a)):
  18.     alph[a[i]] = i
  19.  
  20. MAXN = 1488
  21.  
  22. nxt = []
  23. p = []
  24. pr = []
  25. go = []
  26. link = []
  27. dp = []
  28. was = []
  29. term = []
  30. g = []
  31.  
  32. #init
  33. for i in range(MAXN):
  34.     was.append(0)
  35.     nxt.append([])
  36.     go.append([])
  37.     p.append(-1)
  38.     pr.append(-1)
  39.     link.append(-1)
  40.     dp.append([])
  41.     term.append(0)
  42.     g.append([])
  43.     for j in range(107):
  44.         nxt[i].append(-1)
  45.         dp[i].append(0)
  46.         go[i].append(-1)
  47.  
  48. dp[0][0] = 1
  49.  
  50. def addstr(s):
  51.     global p, pr, nxt, uk
  52.     cur = 0
  53.     for i in range(len(s)):
  54.         let = alph[s[i]]
  55.         if (nxt[cur][let] == -1):
  56.             uk += 1
  57.             nxt[cur][let] = uk
  58.             p[uk] = cur
  59.             pr[uk] = let
  60.         cur = nxt[cur][let]
  61.     term[cur] = 1
  62.  
  63. def getsufflink(u):
  64.     global link, p, pr
  65.     if (link[u] == -1):
  66.         if (u == 0 or p[u] == 0):
  67.             link[u] = 0
  68.         else:
  69.             link[u] = getlink(getsufflink(p[u]), pr[u])
  70.     return link[u]
  71.  
  72. def getlink(u, c):
  73.     global go, nxt
  74.     if (go[u][c] == -1):
  75.         if (nxt[u][c] != -1):
  76.             go[u][c] = nxt[u][c]
  77.         else:
  78.             if (u == 0):
  79.                 go[u][c] = 0
  80.             else:
  81.                 go[u][c] = getlink(getsufflink(u), c)
  82.     return go[u][c]
  83.  
  84. def markterminal(u):
  85.     was[u] = 1
  86.     if (term[u] == 0):
  87.         if (was[u] == 0):
  88.             markterminal(getsufflink(u))
  89.         term[u] = term[getsufflink(u)]
  90.  
  91. for i in range(P):
  92.     s = str(input())
  93.     addstr(s)
  94.  
  95. link[0] = 0
  96.  
  97. for i in range(uk + 1):
  98.     if (was[i] == 0):
  99.         markterminal(i)
  100.  
  101. for i in range(uk + 1):
  102.     if (term[i] == 0):
  103.         for j in range(n):
  104.             to = getlink(i, j)
  105.             if (term[to] == 0):
  106.                 g[to].append(i)
  107.  
  108. for len in range(m):
  109.     for i in range(uk + 1):
  110.         for j in (g[i]):
  111.             dp[i][len + 1] += dp[j][len]
  112.  
  113. ans = 0
  114. for i in range(uk + 1):
  115.     ans += dp[i][m]
  116.  
  117. print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement