题意:给一个串,串中的每个数最多出现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;
}