UVa 1481 - Genome Evolution

题意

统计两个集合中连续的,长度并且元素都相同的子序列的数量

思路

一开始想枚举A的子集,然后字典序排一下,存在MAP里。不过这样 O(n3logn) ,明显超时了。

转换一下思路。记录A集合中的各个元素在B集合中的位置。对于一个长度为len的A的子集,如果他的元素在B中的最大位置-最小位置 + 1 等于len,说明这个序列的其他元素都在他们中间,也就是说这个序列也在中存在。

代码

 
 
  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define lowbit(x) ((x) & (-x))
  4. #define MP(a, b) make_pair(a, b)
  5. const int MAXN = 3000 + 5;
  6. const int INF = 0x3f3f3f3f;
  7. using namespace std;
  8. typedef pair<int, int> pii;
  9. typedef vector<int>::iterator viti;
  10. typedef vector<pii>::iterator vitii;
  11. int a[MAXN], b[MAXN], pos[MAXN];
  12. int main()
  13. {
  14. //freopen("input.txt", "r", stdin);
  15. int n, i, j;
  16. while (scanf("%d", &n), n)
  17. {
  18. for (i = 0; i < n; i++) scanf("%d", a + i);
  19. for (i = 0; i < n; i++) scanf("%d", b + i);
  20. for (i = 0; i < n; i++)
  21. for (j = 0; j < n; j++)
  22. if (a[i] == b[j])
  23. {
  24. pos[a[i]] = j;
  25. break;
  26. }
  27. int ans = 0, maxPos, minPos;
  28. for (i = 0; i < n - 1; i++)
  29. {
  30. maxPos = minPos = pos[a[i]];
  31. for (j = i + 1; j < n; j++)
  32. {
  33. int len = j - i + 1;
  34. maxPos = max(maxPos, pos[a[j]]);
  35. minPos = min(minPos, pos[a[j]]);
  36. if (maxPos - minPos + 1 == len) ans++;
  37. }
  38. }
  39. printf("%d\n", ans);
  40. }
  41. return 0;
  42. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值