前缀后缀集合

来源:互联网 发布:高分一号数据预处理 编辑:程序博客网 时间:2024/06/05 14:52
一个数组包含N个正整数,其中有些是重复的。一个前缀后缀集是满足这样条件的下标对(P,S), 0<= P,S < N 满足数组元素A[0..P]的值也在A[S..N - 1]的值中出现,并且A[S..N - 1]中的值也再A[0..P]中出现。换句话说前缀的集合A[0..P]与后缀集合A[S..N - 1]包含完全相同的值。求这样的前缀后缀集合的数量。

例如:3 5 7 3 3 5,共有14个集合符合条件:(1, 4), (1, 3), (2, 2), (2, 1), (2, 0), (3, 2), (3, 1), (3, 0), (4, 2), (4, 1), (4, 0), (5, 2), (5, 1), (5, 0)
本题由 @javaman 翻译。

Input
第1行:一个数N, 表示数组的长度(1 <= N <= 50000)。第2 - N + 1行:每行1个数,对应数组中的元素Ai。(1 <= Ai <= 10^9)
Output
输出符合条件的集合数量。
Input示例
6357335
Output示例
14
#include <cstring>#include <iostream>#include <set>using namespace std;const int MAXN = 50005;int input[MAXN];int main(){int n;cin >> n;for (int i = 0; i < n; i++){cin >> input[i];}int result = 0;set<int> a, b;int pos = n-1;int count = 0;for (int i = 0; i < n; i++){if (a.find(input[i]) != a.end()){result += count;continue;}a.insert(input[i]);count = 0;for (int j = pos; j >= 0; j--){if (a.find(input[j]) != a.end()){b.insert(input[j]);pos--;}else{break;}if (a.size() == b.size()){result++;count++;}}}cout << result << endl;return 0;}


原创粉丝点击