记录下第二个数组的位置,然后更新第一个数组的区间,然后更新第二个数组的区间,如果区间长度相等,那么就是有子集相等,此时ans++。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(x) scanf("%d",&x)
const int maxn=3000+10;
int s[maxn],t[maxn],vis[maxn];
int n;
int main()
{
while(true)
{
int ans=0;
ss(n);if(n==0) break;
rep(i,1,n) ss(s[i]);
rep(i,1,n) {ss(t[i]);vis[t[i]]=i;}
rep(i,1,n){
int l=vis[s[i]],r=vis[s[i]],k=1;
rep(j,i+1,n){
l=min(l,vis[s[j]]);
r=max(r,vis[s[j]]);
k++;
if(r-l+1==k) ans++;
}
}
printf("%d\n",ans);
}
return 0;
}