题意:从一大长串中截取子串,要求每一个子串中必须要有两个相同的数字,当存在子串的时候输出最多可以存在几个子串(贪心算法),并且输出子串的首尾端点,不存在这种子串的时候就输出-1.
解题策略:贪心算法+STL,每当有两个相同数字出现时则将这一部分变为一个子串,可以获得最大数量。
本人采用了数组的方式来记录下子串的首尾端点,不过要注意开足够大的数组,第一次数组没开够结果runtime error/(ㄒoㄒ)/~~
#include <iostream>
#include <set>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
int a[200000][2];
int main()
{
set<int> s;
int n,num,ans,i;
while(cin>>n)
{
s.clear();
ans = 0;
memset(a,0,sizeof(a));
a[0][0] = 1;
for(i=1;i<=n;i++)
{
cin >> num;
if (s.count(num))
{
a[ans++][1] = i;
a[ans][0] = i+1;
s.clear();
}
else
s.insert(num);
}
if(a[ans-1][1]<n)
a[ans-1][1] = n;
if(ans)
{
printf("%d\n",ans);
for(i=0;i<ans;i++)
{
printf("%d %d\n",a[i][0],a[i][1]);
}
}
else
printf("-1\n");
}
return 0;
}