题目地址:http://vjudge.net/problem/UVALive-5052
题目意思就是 A中[i,j] (j>i) 中的元素数量要和 B中[a,b] (b>a)中的 一样,问有几组?
最主要是保存数字的位置关系 (连续)
第一思路:因为只要是连续就好了 , 想想前缀和的方法: sumA[i]保存 1~i个元素中 n这个数有m个, 然后找sumA[j]-sumA[i]在sumB中有没有 ,应该不是这个方法,实现复杂,时间复杂度也高
第二思路:最简单的方式,对于每个A中的ai,在B中找到,并往前或者后面,扫描 看是否一样,也不行 ,因为只能扫描到头才能确定是否存在
看了网上的题解
题目重点是A,B都是1~n的排列 ,也就是说A和B的元素的一样,且没有重复
所以可以用数组记录B中元素的位置,再扫描A所有子串,所有元素的位置在B中是连续的
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)
#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)
int p[3000+5],A[3000+5],B[3000+5];
int main(int argc, char const *argv[])
{int n;while(scanf("%d",&n)==1&&n){REP(i,1,n) scanf("%d",&A[i]);REP(i,1,n) {int t; scanf("%d",&t); B[t]=i; }int ans=0;REP(i,1,n) {int MinP=B[A[i]];int MaxP=MinP;REP(j,i+1,n) {MinP=min(MinP,B[A[j]]);MaxP=max(MaxP,B[A[j]]);if(MaxP-MinP==j-i) ans++;}}printf("%d\n", ans);}return 0;
}