codeforces 19c 离散化

题意:给一个串,串中的每个数最多出现10次,从左到右进行扫描,如果遇到两个相同且相邻的子串,则删去左边的子串和它左边的部分。问扫描完成后剩下的串是什么?

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int MAXN = 1e5 + 100;
map <int, int> mp;
vector <int> V[MAXN];
int cnt, tel;
struct node {
    int x;
    int id;
} a[MAXN];
int get_id(int x) {
    if(mp. find(x) != mp. end())
        return mp[x];
    return mp[x] = cnt ++;
}
int main() {
    ios :: sync_with_stdio(false);
    int n, flag, tel;
    cin >> n;
    cnt = 1;
    for(int i = 1; i <= n; i ++) {
        cin >> a[i]. x;
        a[i]. id = get_id(a[i]. x);
    }
    for(int i = 1; i <= n; i ++)
        V[a[i]. id]. push_back(i);

    tel = 0;
    for(int i = 2; i <= n; i ++) {
        for(int r = 0; r < V[a[i]. id]. size(); r ++) {
            flag = 0;
            int j = V[a[i]. id][r];
            if(!(j >= 1 && j < i && (i - j) <= (n - i + 1)))
                continue;
            if(j < tel)
                continue;
            flag = 1;
            for(int k = 0; k < i - j; k ++) {
                if(a[j + k]. x != a[i + k]. x) {
                    flag = 0;
                    break;
                }
            }
            if(flag == 1)
                break;
        }
        if(flag == 1)
            tel = i;
    }
    if(tel == 0) {
        cout << n << endl;
        for(int i = 1; i <= n; i ++)
            i == 1 ? cout << a[i]. x : cout << " " << a[i]. x;
        cout << endl;
        return 0;
    }
    cout << n - tel + 1 << endl;
    for(int i = tel; i <= n; i ++)
        i == tel ? cout << a[i]. x : cout << " " << a[i]. x;
    cout << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_38759433/article/details/86584498