给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构。
当存在两个不相交的区间同构时,如:
1、2、……、n -1、n、n + 1、……、m、m + 1、m + 2、 ……、m + n - 1、m + n;(假设m > n&&[1, n]和[m + 1, m + n]同构)
那么 K = n 显然是存在的。但是这不是最大的K,因为[1, m]和[n + 1, n + m]也一定同构(使两边同时加上一个相同区间)
所以这题可以简化为找到一个区间首尾元素相同,求最大区间长度;
Accepted | 4089 | C++11 | 1200 | 23516 |
#include "bits/stdc++.h" using namespace std; typedef long long LL; typedef pair<int, int> PII; const int INF = 0x3f3f3f3f; const int MAXN = 1e5 + 5; map<int, set<int> > mp; multiset<int> ans; int arr[MAXN]; int main() { int t, n, m; scanf("%d", &t); while (t--) { mp.clear(); ans.clear(); scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { scanf("%d", &arr[i]); mp[arr[i]].insert(i); } for (auto i : mp) { ans.insert(*(--i.second.end()) - *i.second.begin()); } int op, x, y; while (m--) { scanf("%d", &op); if (op == 2) { if (*(--ans.end()) == 0) { puts("-1"); } else { printf("%d\n", *(--ans.end())); } } else { scanf("%d%d", &x, &y); auto it = ans.find(*(--mp[arr[x]].end()) - *mp[arr[x]].begin()); ans.erase(it); mp[arr[x]].erase(x); if (!mp[arr[x]].empty()) { ans.insert(*(--mp[arr[x]].end()) - *mp[arr[x]].begin()); } if (!mp[y].empty()) { it = ans.find(*(--mp[y].end()) - *mp[y].begin()); ans.erase(it); } arr[x] = y; mp[y].insert(x); ans.insert(*(--mp[y].end()) - *mp[y].begin()); } } } return 0; }
可能表述不是很清楚,这题参考了一下https://www.cnblogs.com/hua-dong/p/10293407.html这位大佬的博客;
原文地址:https://www.cnblogs.com/Angel-Demon/p/10295711.html
时间: 2024-10-13 16:34:50