Advertisement
Guest User

Untitled

a guest
Mar 4th, 2015
216
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.23 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <vector>
  5. #include <algorithm>
  6. #include <cstring>
  7. #include <string>
  8. #include <map>
  9. #include <set>
  10. #include <cmath>
  11. using namespace std;
  12.  
  13. #ifdef LOCAL
  14. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  15. #else
  16. #define eprintf(...) 42
  17. #endif
  18.  
  19. const int LEN = 42;
  20. const int N = (int)1e4 + 10;
  21. const int A = 26;
  22.  
  23. char str[LEN];
  24. int go[2][N * LEN][A];
  25. int countEdges[2][A];
  26. int mv[2] = {1, 1};
  27. int term[2][N * LEN];
  28. long long answer = 0;
  29.  
  30. void addInBor(int type)
  31. {
  32. int len = strlen(str);
  33. int v = 0;
  34. for (int i = 0; i < len; i++)
  35. {
  36. int c = str[i] - 'a';
  37. if (go[type][v][c] == 0)
  38. {
  39. go[type][v][c] = mv[type]++;
  40. countEdges[type][c]++;
  41. }
  42. v = go[type][v][c];
  43. }
  44. term[type][v] = 1;
  45. }
  46.  
  47. void calcAnswer(int v)
  48. {
  49. for (int c = 0; c < A; c++)
  50. {
  51. int to = go[0][v][c];
  52. if (to == 0 && v != 0)
  53. answer += countEdges[1][c];
  54. else if (to != 0)
  55. {
  56. calcAnswer(to);
  57. if (!term[0][to] && go[1][0][c] != 0)
  58. answer++;
  59. }
  60. }
  61. }
  62.  
  63. int main()
  64. {
  65. freopen ("dictionary.in", "r", stdin);
  66. // freopen ("dictionary.out", "w", stdout);
  67.  
  68. int n;
  69. scanf("%d", &n);
  70. for (int i = 0; i < n; i++)
  71. {
  72. scanf(" %s", str);
  73. int len = strlen(str);
  74. addInBor(0);
  75. reverse(str, str + len);
  76. addInBor(1);
  77. }
  78.  
  79. for (int i = 0; i < mv[0]; i++)
  80. answer += t#include <iostream>
  81. #include <cstdio>
  82. #include <cstdlib>
  83. #include <vector>
  84. #include <algorithm>
  85. #include <cstring>
  86. #include <string>
  87. #include <map>
  88. #include <set>
  89. #include <cmath>
  90. using namespace std;
  91.  
  92. #ifdef LOCAL
  93. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  94. #else
  95. #define eprintf(...) 42
  96. #endif
  97.  
  98. const int INF = (int)1e9;
  99. const int SPACE = 26;
  100. const int A = 27;
  101. const int K = 31;
  102. const int M = 31;
  103. const int LEN = 31;
  104. const int N = 2040;
  105.  
  106. int m, n, k;
  107. char font[M][N];
  108. char letterFont[A][M][K];
  109. char text[LEN];
  110. int skip[LEN];
  111. char table[M][N];
  112. int countOn[N];
  113.  
  114. int costPut[A][N];
  115.  
  116. int dp[N][LEN];
  117. int par[N][LEN];
  118.  
  119. string temp;
  120.  
  121. void printTable()
  122. {
  123. for (int i = 0; i < m; i++, puts(""))
  124. for (int s = 0; s < n; s++)
  125. printf("%c", table[i][s]);
  126. }
  127.  
  128. void scanText()
  129. {
  130. getline(cin, temp);
  131. for (int i = 0; i < (int)temp.length(); i++)
  132. text[i] = temp[i];
  133. text[(int)temp.length()] = 0;
  134. }
  135.  
  136. int getLetterIndex(char c)
  137. {
  138. if (c == ' ')
  139. return SPACE;
  140. return c - 'A';
  141. }
  142.  
  143. void parseLetter(int letter, int x)
  144. {
  145. for (int i = 0; i < m; i++)
  146. for (int s = 0; s < k; s++)
  147. letterFont[letter][i][s] = font[i][x + s];
  148. }
  149.  
  150. void addSpace()
  151. {
  152. for (int i = 0; i < m; i++)
  153. for (int s = 0; s < k; s++)
  154. letterFont[SPACE][i][s] = '.';
  155. }
  156.  
  157. void parseFont()
  158. {
  159. int len = strlen(font[0]);
  160. for (int i = 0; i < len; i += k + 3)
  161. {
  162. int letter = font[0][i] - 'A';
  163. parseLetter(letter, i + 2);
  164. }
  165. addSpace();
  166. }
  167.  
  168. void putLetter(int position, char c)
  169. {
  170. eprintf("Put letter %c in position %d\n", c, position);
  171. int index = getLetterIndex(c);
  172. for (int i = 0; i < m; i++)
  173. for (int s = 0; s < k; s++)
  174. table[i][s + position] = letterFont[index][i][s];
  175. }
  176.  
  177. void createTable()
  178. {
  179. int len = strlen(text);
  180. int position = 0;
  181. for (int i = 0; i < len; i++)
  182. {
  183. position += skip[i];
  184. putLetter(position, text[i]);
  185. position += k;
  186. }
  187. }
  188.  
  189. int getCostPut(int letter, int position)
  190. {
  191. int cost = 0;
  192. for (int i = 0; i < m; i++)
  193. for (int s = 0; s < k; s++)
  194. cost += (table[i][s + position] != letterFont[letter][i][s]);
  195. return cost;
  196. }
  197.  
  198. void calcCostPut()
  199. {
  200. for (int letter = 0; letter < A; letter++)
  201. {
  202. for (int position = 0; position < N; position++)
  203. costPut[letter][position] = INF;
  204. for (int position = 0; position + k <= n; position++)
  205. {
  206. costPut[letter][position] = getCostPut(letter, position);
  207. }
  208. }
  209. }
  210.  
  211. void calcCountOn()
  212. {
  213. for (int i = 0; i < n; i++)
  214. {
  215. countOn[i] = (i == 0 ? 0 : countOn[i - 1]);
  216. for (int s = 0; s < m; s++)
  217. countOn[i] += (table[s][i] == '*' ? 1 : 0);
  218. }
  219. }
  220.  
  221. int getCountOn(int l, int r)
  222. {
  223. if (l > r)
  224. return 0;
  225. return countOn[r] - (l == 0 ? 0 : countOn[l - 1]);
  226. }
  227.  
  228. void relaxDp(int &a, int b)
  229. {
  230. a = max(a, b);
  231. }
  232.  
  233. int answer = INF;
  234. int answerPosition;
  235.  
  236. void calcDp(int minS, int maxS)
  237. {
  238. int textLength = strlen(text);
  239. for (int i = 0; i < N; i++)
  240. for (int s = 0; s < LEN; s++)
  241. dp[i][s] = INF;
  242.  
  243. for (int i = 0; i < n; i++)
  244. {
  245. dp[i][0] = getCountOn(0, i - 1);
  246. par[i][0] = i;
  247. }
  248. for (int i = 0; i < n; i++)
  249. {
  250. for (int pos = 0; pos < textLength; pos++)
  251. {
  252. if (dp[i][pos] == INF)
  253. continue;
  254. eprintf("Dp : i = %d, letter = %c, result = %d\n", i, text[pos], dp[i][pos]);
  255. int letter = getLetterIndex(text[pos]);
  256. int added = costPut[letter][i];
  257.  
  258. int newAnswer = dp[i][pos] + added + getCountOn(i + k, n - 1);
  259. if (pos == textLength - 1 && answer > newAnswer)
  260. {
  261. answer = newAnswer;
  262. answerPosition = i;
  263. }
  264. for (int space = minS; space <= maxS && i + k + space < n; space++)
  265. {
  266. int newValue = dp[i][pos] + added + getCountOn(i + k, i + k + space - 1);
  267. if (dp[i + k + space][pos + 1] > newValue)
  268. {
  269. dp[i + k + space][pos + 1] = newValue;
  270. par[i + k + space][pos + 1] = space;
  271. }
  272. }
  273. }
  274. }
  275. }
  276.  
  277. void restoreAns(int index, int pos)
  278. {
  279. if (index < 0)
  280. return;
  281. restoreAns(index - 1, pos - par[pos][index] - k);
  282. printf("%d ", par[pos][index]);
  283. }
  284.  
  285. int main()
  286. {
  287. freopen ("caption.in", "r", stdin);
  288. freopen ("caption.out", "w", stdout);
  289.  
  290. scanf("%d%d%d", &m, &n, &k);
  291. int minS, maxS;
  292. scanf("%d%d\n", &minS, &maxS);
  293.  
  294. for (int i = 0; i < m; i++)
  295. {
  296. getline(cin, temp);
  297. for (int s = 0; s < (int)temp.length(); s++)
  298. font[i][s] = temp[s];
  299. }
  300.  
  301. parseFont();
  302.  
  303. scanText();
  304.  
  305. eprintf("%s\n", text);
  306. int textLength = strlen(text);
  307. for (int i = 0; i < textLength; i++)
  308. scanf("%d ", &skip[i]);
  309.  
  310. memset(table, '.', sizeof(table));
  311. createTable();
  312. calcCostPut();
  313. calcCountOn();
  314.  
  315. // printTable();
  316.  
  317. scanText();
  318. eprintf("New text = %s, len = %d\n", text, (int)strlen(text));
  319. calcDp(minS, maxS);
  320. eprintf("answer position = %d\n", answerPosition);
  321. eprintf("Answer value = %d\n", answerPosition);
  322. restoreAns(strlen(text) - 1, answerPosition);
  323.  
  324. return 0;
  325. }
  326. erm[0][i];
  327. calcAnswer(0);
  328.  
  329. printf("%lld", answer);
  330.  
  331. return 0;
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement