题意:
让你求出区间内各个特征的个数相同的最大区间的长度。
思路:
参考别人的,话说这思路真的好6。将思路转化为了求相同的串的最大距离。
思路下面链接,我就不班门弄斧了。
http://blog.youkuaiyun.com/lyy289065406/article/details/6647365
code:
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <cstdio>
#include <vector>
#include <map>
using namespace std;
const int MAXN = 1e5+5;
const int MAXK = 35;
//const int X = 123;
const int MOD = 99991;
typedef long long LL;
int n, k;
int sum[MAXN][MAXK];
int c[MAXN][MAXK];
vector <int> ht[MOD+5];
void deal(int idx, int val) {
int cnt = 0;
while(val) {
if(val & 1) sum[idx][cnt]++;
val >>= 1;
cnt++;
}
for(int i = 0;i < k; i++)
sum[idx][i] += sum[idx-1][i];
}
void init() {
memset(sum, 0, sizeof(sum));
for(int i = 0;i < MOD+5; i++)
ht[i].clear();
}
int myHash(int idx) {
int ret = 0;
for(int i = 0;i < k; i++) {
ret += c[idx][i];
}
ret %= MOD;
if(ret < 0) ret += MOD;
return ret;
}
void solve() {
//c[0][]
for(int i = 0;i < k; i++)
c[0][i] = 0;
ht[myHash(0)].push_back(0);
//
int res = 0;
for(int i = 1;i <= n; i++) {
for(int j = 0;j < k; j++)
c[i][j] = sum[i][j]-sum[i][0];
int h = myHash(i);
//
for(int j = 0;j < ht[h].size(); j++) {
int idx = ht[h][j];
bool flag = true;
for(int z = 0;z < k; z++) {
if(c[idx][z] != c[i][z]) {
flag = false;
break;
}
}
if(flag) res = max(res, i-idx);
}
ht[h].push_back(i);
}
printf("%d\n", res);
}
int main() {
while(scanf("%d%d", &n, &k) != EOF) {
init();
int tmp;
for(int i = 1;i <= n; i++) {
scanf("%d", &tmp);
deal(i, tmp);
}
solve();
}
return 0;
}
本文介绍了一种求解区间内各特征计数相同的最长区间的高效算法,并提供了完整的C++实现代码。通过巧妙地将问题转化为求相同哈希值的最远距离问题,实现了快速查找。代码中使用了哈希表来存储历史状态,以便于比较。
351

被折叠的 条评论
为什么被折叠?



