ZOJ-4089-Little Sub and Isomorphism Sequences

给定你个数组,以及一些单点修改,以及询问,每次询问需要求得,最长的字串长度,它在其他位置存在同构。

当存在两个不相交的区间同构时,如:

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
", *(--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