| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
狂wa啊,有空的帮我看下哦...// 先是根据数据元素的大小,对下标进行排序
// 然后根据下标,求出每两个相邻元素最长匹配串长
// 然后二分枚举答案...
// 感觉只要不是所有元素全部相同还是可以通过的.
// 算法有问题么?
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
#define SIZE 20011
int array[SIZE];
struct Idx
{
int i;
}idx[SIZE];
int n , k;
int eq[SIZE];
int Match (int a , int b)
{
int cnts = 0;
while (a < n && b < n && array[a] == array[b])
{
cnts++;
a++;
b++;
}
return cnts;
}
inline bool operator < (const Idx &a , const Idx &b)
{
return array[a.i] < array[b.i];
}
int main ()
{
#ifndef ONLINE_JUDGE
freopen ("in.txt","r",stdin);
#endif
int i;
while (EOF != scanf ("%d%d",&n , &k))
{
for (i = 0;i < n;i++)
{
scanf ("%d",&array[i]);
idx[i].i = i;
}
sort (idx , idx + n );
memset (eq , 0 , sizeof (eq));
for (i = 1;i < n;i++)
{
eq[i] = Match (idx[i].i , idx[i - 1].i);
}
int left , right , mid;
int cnts;
bool can;
left = 0;
right = n + 1;
//cout << left << " " << right << endl;
while (left < right)
{
// 二分最长匹配
mid = (left + right) / 2 + 1;
for (i = 1 , cnts = 1 , can = false;i < n;i++)
{
if (eq[i] >= mid)
cnts++;
else
cnts = 1;
if (cnts >= k)
{
can = true;
break;
}
}
if (can)
left = mid;
else
right = mid - 1;
}
cout << left << endl;
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator