Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef unsigned int ui;
- typedef vector<int> vi;
- typedef vector<ll> vll;
- typedef pair<int, int> pii;
- #define all(v) v.begin(), v.end()
- #define mk make_pair
- #define forn(i, n) for(int i = 0; i < (int)n; ++i)
- #define X first
- #define Y second
- #define inb push_back
- const int INF = (int)1e9 + 7;
- int c, r, n;
- int ans = 0;
- vector <string> a;
- vector <int> slposl[2001], slposr[2001];
- vector <int> d[2001];
- int dx[4] = { 0, -1, 1, 0 };
- int dy[4] = { -1, 0, 0, 1 };
- void init()
- {
- forn(i, n)
- {
- d[i].resize(a[i].size());
- forn(j, a[i].size())
- {
- d[i][j] = INF;
- }
- }
- }
- void dij()
- {
- set< pair<int, pii> > q;
- d[c][r] = 0;
- q.insert(mk(0, mk(c, r)));
- while (!q.empty())
- {
- int dst = (*q.begin()).X;
- ans = max(ans, dst);
- int s = (*q.begin()).Y.X;
- int p = (*q.begin()).Y.Y;
- q.erase((*q.begin()));
- forn(i, 4)
- {
- int ns = s + dx[i];
- int np = p + dy[i];
- ns = max(0, ns);
- ns = min(n - 1, ns);
- np = max(0, np);
- np = min((int)a[ns].size() - 1, np);
- if (dst + 1 < d[ns][np])
- {
- q.erase(mk(d[ns][np], mk(ns, np)));
- d[ns][np] = dst + 1;
- q.insert(mk(d[ns][np], mk(ns, np)));
- }
- }
- if (dst + 1 < d[s][0])
- {
- q.erase(mk(d[s][0], mk(s, 0)));
- d[s][0] = dst + 1;
- q.insert(mk(d[s][0], mk(s, 0)));
- }
- if (dst + 1 < d[s][a[s].size() - 1])
- {
- q.erase(mk(d[s][a[s].size() - 1], mk(s, a[s].size() - 1)));
- d[s][a[s].size() - 1] = dst + 1;
- q.insert(mk(d[s][a[s].size() - 1], mk(s, a[s].size() - 1)));
- }
- //WORD L
- {
- int np = slposl[s][p];
- if (dst + 2 < d[s][np])
- {
- q.erase(mk(d[s][np], mk(s, np)));
- d[s][np] = dst + 2;
- q.insert(mk(d[s][np], mk(s, np)));
- }
- }
- //WORD R
- {
- int np = slposr[s][p];
- if (dst + 2 < d[s][np])
- {
- q.erase(mk(d[s][np], mk(s, np)));
- d[s][np] = dst + 2;
- q.insert(mk(d[s][np], mk(s, np)));
- }
- }
- }
- }
- int solve()
- {
- cin >> c >> r;
- --c, --r;
- string s;
- getline(cin, s);
- int i = 0;
- while (getline(cin, s))
- {
- slposl[i].resize(s.size());
- slposr[i].resize(s.size());
- int cur = 0;
- for (int j = 0; j < s.size(); ++j)
- {
- slposl[i][j] = cur;
- if (s[j] == ' ')
- cur = j + 1;
- }
- cur = s.size() - 1;
- for (int j = s.size() - 1; j >= 0; --j)
- {
- slposr[i][j] = cur;
- if (s[j] == ' ')
- cur = j + 1;
- }
- a.inb(s);
- ++i;
- }
- n = a.size();
- init();
- dij();
- printf("%d", ans);
- return 0;
- }
- int main()
- {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- solve();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement