提交时间:2024-10-04 13:32:10

运行 ID: 33080

#include <bits/stdc++.h> using namespace std; #define ll long long const int N = 2e5 + 5; int dir[200][2]; int n, delta[N]; char s[N]; ll k, ans; map<pair<int, int>, int> vis; int f[N], change[N][2]; int find(int idx) { //cout << idx << endl; if (f[idx] == idx) return idx; return f[idx] = find(f[idx]); } void merge(int u, int v) // u -> v { int x = find(u), y = find(v); if (x != y) { f[x] = y; change[y][0] += change[x][0]; change[y][1] += change[x][1]; } } int main() { dir['L'][0] = -1, dir['L'][1] = 0; dir['R'][0] = 1, dir['R'][1] = 0; dir['U'][0] = 0, dir['U'][1] = 1; dir['D'][0] = 0, dir['D'][1] = -1; scanf("%s%lld", s + 1, &k); n = strlen(s + 1); int lmt = min((ll)n, k); int x = 0, y = 0, tx, ty; int lp; delta[0] = -1; for (int i = 1; i <= n + 1; i++) f[i] = i, change[i][0] = dir[s[i]][0], change[i][1] = dir[s[i]][1]; int cnt = 0; for (lp = 1; lp <= n; lp++) { //cout << lp << ' ' << find(1) << endl; //cout << "----"; x += change[find(1)][0], y += change[find(1)][1]; for (int i = find(1); i <= n; i = find(i + 1)) { //cout << i << ' ' ; tx = x + change[find(i + 1)][0], ty = y + change[find(i + 1)][1]; //x += change[i][0], y += change[i][1]; // cout << change[i][0] << ' ' << change[i][1] << endl; // cout << i << ' ' << x << ' ' << y << endl << endl;; int tmp = vis[{x, y}]; if (!tmp) { //cout << i << ' '; delta[lp]++; vis[{x, y}] = lp; } else if (tmp < lp) merge(i, i + 1); x = tx, y = ty; } //puts(""); x = tx, y = ty; //cout<< endl; //x += change[n + 1][0], y += change[n + 1][1]; // for (int i = 1; i <= n; i++) // printf("%d%c", find(i), " \n"[i == n]); //cout << delta[lp] << ' '; if (delta[lp] == delta[lp - 1]) cnt++; else cnt = 0; if (cnt >= 100) break; } // cout << endl << lp << endl; for (lp = lp + 1; lp <= n; lp++) delta[lp] = delta[lp - 1]; if (k > n) { for (int i = 1; i <= n; i++) ans += delta[i]; ans += 1ll * (k - n) * delta[n]; } else for (int i = 1; i <= k; i++) ans += delta[i]; cout << ans << endl; return 0; } /* 569 385 385 3 8219523277534 */