64,637
社区成员
发帖
与我相关
我的任务
分享
你可以用下面的代码AC
#include <iostream>
#include <cstring>
using namespace std;
int data[100005];
int main()
{
int n, q;
while (scanf("%d%d", &n, &q) == 2)
{
int ans = 1, dest = (1<<(q+1))-2;
for (int i = 0; i < n; ++i) scanf("%d", data+i);
for (int curr = 0;;)
{
int flag = 0;
while (curr < n && flag != dest) flag |= 1 << data[curr++];
if (flag != dest) break;
++ans;
}
printf("%d\n", ans);
}
return 0;
}
解释来源:http://blog.sina.com.cn/s/blog_4d90595a01000b45.html
这个题看上去很难啊,因为原来广搜+哈希不能用了,一是因为它的子串不是相连的,二是数据量大,当q是9时,最多用哈希存十位数就超内存了,既然这样我们就直接放弃那种做法(因为不能用,只能放弃嘛!!)
现在我要说的办法是惊天地泣鬼神的超强做法,我当时没证明就用了,结果居然对了,那就算对了
当第1位到第m1位有1到q的所有数时,一定就能凑出第一位的所有数,再从第m1+1位开始到m2位为止如果在能找到1到q的所有数,那么,两位的所有数就又能找出了,在开始找,一直找到最后为止