Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <vector>
- #include <algorithm>
- #include <cstring>
- #include <string>
- #include <map>
- #include <set>
- #include <cmath>
- using namespace std;
- #ifdef LOCAL
- #define eprintf(...) fprintf(stderr, __VA_ARGS__)
- #else
- #define eprintf(...) 42
- #endif
- const int LEN = 42;
- const int N = (int)1e4 + 10;
- const int A = 26;
- char str[LEN];
- int go[2][N * LEN][A];
- int countEdges[2][A];
- int mv[2] = {1, 1};
- int term[2][N * LEN];
- long long answer = 0;
- void addInBor(int type)
- {
- int len = strlen(str);
- int v = 0;
- for (int i = 0; i < len; i++)
- {
- int c = str[i] - 'a';
- if (go[type][v][c] == 0)
- {
- go[type][v][c] = mv[type]++;
- countEdges[type][c]++;
- }
- v = go[type][v][c];
- }
- term[type][v] = 1;
- }
- void calcAnswer(int v)
- {
- for (int c = 0; c < A; c++)
- {
- int to = go[0][v][c];
- if (to == 0 && v != 0)
- answer += countEdges[1][c];
- else if (to != 0)
- {
- calcAnswer(to);
- if (!term[0][to] && go[1][0][c] != 0)
- answer++;
- }
- }
- }
- int main()
- {
- freopen ("dictionary.in", "r", stdin);
- // freopen ("dictionary.out", "w", stdout);
- int n;
- scanf("%d", &n);
- for (int i = 0; i < n; i++)
- {
- scanf(" %s", str);
- int len = strlen(str);
- addInBor(0);
- reverse(str, str + len);
- addInBor(1);
- }
- for (int i = 0; i < mv[0]; i++)
- answer += t#include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <vector>
- #include <algorithm>
- #include <cstring>
- #include <string>
- #include <map>
- #include <set>
- #include <cmath>
- using namespace std;
- #ifdef LOCAL
- #define eprintf(...) fprintf(stderr, __VA_ARGS__)
- #else
- #define eprintf(...) 42
- #endif
- const int INF = (int)1e9;
- const int SPACE = 26;
- const int A = 27;
- const int K = 31;
- const int M = 31;
- const int LEN = 31;
- const int N = 2040;
- int m, n, k;
- char font[M][N];
- char letterFont[A][M][K];
- char text[LEN];
- int skip[LEN];
- char table[M][N];
- int countOn[N];
- int costPut[A][N];
- int dp[N][LEN];
- int par[N][LEN];
- string temp;
- void printTable()
- {
- for (int i = 0; i < m; i++, puts(""))
- for (int s = 0; s < n; s++)
- printf("%c", table[i][s]);
- }
- void scanText()
- {
- getline(cin, temp);
- for (int i = 0; i < (int)temp.length(); i++)
- text[i] = temp[i];
- text[(int)temp.length()] = 0;
- }
- int getLetterIndex(char c)
- {
- if (c == ' ')
- return SPACE;
- return c - 'A';
- }
- void parseLetter(int letter, int x)
- {
- for (int i = 0; i < m; i++)
- for (int s = 0; s < k; s++)
- letterFont[letter][i][s] = font[i][x + s];
- }
- void addSpace()
- {
- for (int i = 0; i < m; i++)
- for (int s = 0; s < k; s++)
- letterFont[SPACE][i][s] = '.';
- }
- void parseFont()
- {
- int len = strlen(font[0]);
- for (int i = 0; i < len; i += k + 3)
- {
- int letter = font[0][i] - 'A';
- parseLetter(letter, i + 2);
- }
- addSpace();
- }
- void putLetter(int position, char c)
- {
- eprintf("Put letter %c in position %d\n", c, position);
- int index = getLetterIndex(c);
- for (int i = 0; i < m; i++)
- for (int s = 0; s < k; s++)
- table[i][s + position] = letterFont[index][i][s];
- }
- void createTable()
- {
- int len = strlen(text);
- int position = 0;
- for (int i = 0; i < len; i++)
- {
- position += skip[i];
- putLetter(position, text[i]);
- position += k;
- }
- }
- int getCostPut(int letter, int position)
- {
- int cost = 0;
- for (int i = 0; i < m; i++)
- for (int s = 0; s < k; s++)
- cost += (table[i][s + position] != letterFont[letter][i][s]);
- return cost;
- }
- void calcCostPut()
- {
- for (int letter = 0; letter < A; letter++)
- {
- for (int position = 0; position < N; position++)
- costPut[letter][position] = INF;
- for (int position = 0; position + k <= n; position++)
- {
- costPut[letter][position] = getCostPut(letter, position);
- }
- }
- }
- void calcCountOn()
- {
- for (int i = 0; i < n; i++)
- {
- countOn[i] = (i == 0 ? 0 : countOn[i - 1]);
- for (int s = 0; s < m; s++)
- countOn[i] += (table[s][i] == '*' ? 1 : 0);
- }
- }
- int getCountOn(int l, int r)
- {
- if (l > r)
- return 0;
- return countOn[r] - (l == 0 ? 0 : countOn[l - 1]);
- }
- void relaxDp(int &a, int b)
- {
- a = max(a, b);
- }
- int answer = INF;
- int answerPosition;
- void calcDp(int minS, int maxS)
- {
- int textLength = strlen(text);
- for (int i = 0; i < N; i++)
- for (int s = 0; s < LEN; s++)
- dp[i][s] = INF;
- for (int i = 0; i < n; i++)
- {
- dp[i][0] = getCountOn(0, i - 1);
- par[i][0] = i;
- }
- for (int i = 0; i < n; i++)
- {
- for (int pos = 0; pos < textLength; pos++)
- {
- if (dp[i][pos] == INF)
- continue;
- eprintf("Dp : i = %d, letter = %c, result = %d\n", i, text[pos], dp[i][pos]);
- int letter = getLetterIndex(text[pos]);
- int added = costPut[letter][i];
- int newAnswer = dp[i][pos] + added + getCountOn(i + k, n - 1);
- if (pos == textLength - 1 && answer > newAnswer)
- {
- answer = newAnswer;
- answerPosition = i;
- }
- for (int space = minS; space <= maxS && i + k + space < n; space++)
- {
- int newValue = dp[i][pos] + added + getCountOn(i + k, i + k + space - 1);
- if (dp[i + k + space][pos + 1] > newValue)
- {
- dp[i + k + space][pos + 1] = newValue;
- par[i + k + space][pos + 1] = space;
- }
- }
- }
- }
- }
- void restoreAns(int index, int pos)
- {
- if (index < 0)
- return;
- restoreAns(index - 1, pos - par[pos][index] - k);
- printf("%d ", par[pos][index]);
- }
- int main()
- {
- freopen ("caption.in", "r", stdin);
- freopen ("caption.out", "w", stdout);
- scanf("%d%d%d", &m, &n, &k);
- int minS, maxS;
- scanf("%d%d\n", &minS, &maxS);
- for (int i = 0; i < m; i++)
- {
- getline(cin, temp);
- for (int s = 0; s < (int)temp.length(); s++)
- font[i][s] = temp[s];
- }
- parseFont();
- scanText();
- eprintf("%s\n", text);
- int textLength = strlen(text);
- for (int i = 0; i < textLength; i++)
- scanf("%d ", &skip[i]);
- memset(table, '.', sizeof(table));
- createTable();
- calcCostPut();
- calcCountOn();
- // printTable();
- scanText();
- eprintf("New text = %s, len = %d\n", text, (int)strlen(text));
- calcDp(minS, maxS);
- eprintf("answer position = %d\n", answerPosition);
- eprintf("Answer value = %d\n", answerPosition);
- restoreAns(strlen(text) - 1, answerPosition);
- return 0;
- }
- erm[0][i];
- calcAnswer(0);
- printf("%lld", answer);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement