当前位置: 首页 > news >正文

阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计

多约束条件下的元素匹配统计

阿里算法岗 0530笔试 第二题

题目内容

给定三个长度为n nn的数组{ a 1 , a 2 , … , a n } \{a_1, a_2, \dots, a_n\}{a1,a2,,an}{ b 1 , b 2 , … , b n } \{b_1, b_2, \dots, b_n\}{b1,b2,,bn}{ c 1 , c 2 , … , c n } \{c_1, c_2, \dots, c_n\}{c1,c2,,cn}。这里c j c_jcj表示对数组b bb的一个下标。 请你统计满足以下条件的有序对( i , j ) (i, j)(i,j)的数量:

  • 1 ≤ i ≤ j ≤ n 1 \le i \le j \le n1ijn
  • a i = b c j a_i = b_{c_j}ai=bcj

输入描述

每个测试文件均包含多组测试数据。第一行输入一个整数T TT1 ≤ T ≤ 2 × 10 5 1 \le T \le 2 \times 10^51T2×105)代表数据组数;除此之外,保证单个测试文件的n nn之和不超过2 × 10 5 2 \times 10^52×105。 每组测试数据的输入格式如下:

  • 第一行输入一个整数n nn1 ≤ n ≤ 10 5 1 \le n \le 10^51n105);
  • 第二行输入n nn个整数a 1 , a 2 , … , a n a_1, a_2, \dots, a_na1,a2,,an1 ≤ a i ≤ 10 9 1 \le a_i \le 10^91ai109);
  • 第三行输入n nn个整数b 1 , b 2 , … , b n b_1, b_2, \dots, b_nb1,b2,,bn1 ≤ b i ≤ 10 9 1 \le b_i \le 10^91bi109);
  • 第四行输入n nn个整数c 1 , c 2 , … , c n c_1, c_2, \dots, c_nc1,c2,,cn1 ≤ c j ≤ n 1 \le c_j \le n1cjn)。

输出描述

对于每一组测试数据,新起一行输出一个整数,表示满足条件的有序对数量。

样例1

输入

2 5 1 2 1 2 1 2 1 3 1 2 2 1 5 4 3 3 7 7 7 1 2 7 3 3 3

输出

5 6

题解

思路

哈希表

  1. 从前往后枚举j,当前可以组成的合法有序对是a下标为(1, j)中值等于b[c[j]]的数量。
  2. 按照1的分析,并且随着j递增,不同数字的数量只会增加不会减少,所以可以定义numCount哈希表统计前[1,j]a各种数的数量。
  3. 从前往后枚举j,每次j递增时,更新numCount[a[j]]++,并增加当前j情况下能组成的合法有序对ans += numCount[b[c[j]]]

C++

#include<bits/stdc++.h>usingnamespacestd;intmain(){ios_base::sync_with_stdio(false);cin.tie(nullptr);intT;cin>>T;while(T--){intn;cin>>n;vector<int>a(n+1),b(n+1),c(n+1);for(inti=1;i<=n;i++){cin>>a[i];}for(inti=1;i<=n;i++){cin>>b[i];}for(inti=1;i<=n;i++){cin>>c[i];}// 记录下标小于j中a每种数字的数量unordered_map<int,int>numCount;intans=0;for(intj=1;j<=n;j++){numCount[a[j]]++;ans+=numCount[b[c[j]]];}cout<<ans<<endl;}return0;}

java

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intT=sc.nextInt();while(T-->0){intn=sc.nextInt();int[]a=newint[n+1];int[]b=newint[n+1];int[]c=newint[n+1];for(inti=1;i<=n;i++){a[i]=sc.nextInt();}for(inti=1;i<=n;i++){b[i]=sc.nextInt();}for(inti=1;i<=n;i++){c[i]=sc.nextInt();}// 记录下标小于j中a每种数字的数量HashMap<Integer,Integer>numCount=newHashMap<>();longans=0;for(intj=1;j<=n;j++){numCount.put(a[j],numCount.getOrDefault(a[j],0)+1);ans+=numCount.getOrDefault(b[c[j]],0);}System.out.println(ans);}sc.close();}}

python

fromcollectionsimportdefaultdict T=int(input())for_inrange(T):n=int(input())a=[0]+list(map(int,input().split()))b=[0]+list(map(int,input().split()))c=[0]+list(map(int,input().split()))# 记录下标小于j中a每种数字的数量num_count=defaultdict(int)ans=0forjinrange(1,n+1):num_count[a[j]]+=1ans+=num_count[b[c[j]]]print(ans)

javascript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});constlines=[];rl.on('line',(line)=>{lines.push(line);});rl.on('close',()=>{letidx=0;constT=Number(lines[idx++]);for(lett=0;t<T;t++){constn=Number(lines[idx++]);consta=[0,...lines[idx++].split(' ').map(Number)];constb=[0,...lines[idx++].split(' ').map(Number)];constc=[0,...lines[idx++].split(' ').map(Number)];// 记录下标小于j中a每种数字的数量constnumCount=newMap();letans=0;for(letj=1;j<=n;j++){numCount.set(a[j],(numCount.get(a[j])||0)+1);ans+=numCount.get(b[c[j]])||0;}console.log(ans);}});

Go

packagemainimport"fmt"funcmain(){varTintfmt.Scan(&T)forT>0{T--varnintfmt.Scan(&n)a:=make([]int,n+1)b:=make([]int,n+1)c:=make([]int,n+1)fori:=1;i<=n;i++{fmt.Scan(&a[i])}fori:=1;i<=n;i++{fmt.Scan(&b[i])}fori:=1;i<=n;i++{fmt.Scan(&c[i])}// 记录下标小于j中a每种数字的数量numCount:=make(map[int]int)varansint64=0forj:=1;j<=n;j++{numCount[a[j]]++ans+=int64(numCount[b[c[j]]])}fmt.Println(ans)}}
http://www.jsqmd.com/news/982719/

相关文章:

  • 企业级GB28181视频监控平台:构建统一安防系统的终极解决方案
  • 如何在Photoshop中直接使用Stable Diffusion?5分钟快速上手终极AI插件指南
  • 广州服装货源怎么找?AI穿搭教学+拿货避坑指南,这个穿搭博主藏了太多干货 - 资讯纵览
  • 西科大数电实验四:D/ JK/ RS触发器FPGA实现与Diamond波形仿真全套工程文件
  • 嵌入式系统设计:从数据手册到实战,解析KL82模拟外设与电气规格
  • Horizon RDS场实战:从安全策略配置到应用程序池权限管理的完整避坑指南
  • 客户投诉率降低95%!往复式洗车机如何赋能洗车连锁门店转型升级? - 资讯纵览
  • i.MX53引脚配置全解析:从数据手册到硬件设计的实战指南
  • 从零到精通:Draw.io Mermaid插件完全指南
  • 屈光发育档案:一个儿童视力数据追踪系统——以及它为什么比单次验光能提供更多判断依据
  • UniApp扫码功能商业化升级指南:如何像支付宝/微信一样‘秒扫’(基于mPaaS插件)
  • 3Tops NPU + 4核高性能架构:灵眸科技EASY-EAI-PI2开发板,为边缘AI开启“easy模式”
  • 让Mac文件预览体验提升10倍的秘密武器:50+款QuickLook插件深度解析
  • STM32多型号串口DMA收发工程包:空闲中断+环形缓冲+RTOS兼容方案
  • 投资金条变现攻略!9家机构横评,2026沈阳大盘价贴合度真实排行 - 奢侈品回收评测
  • git查看远端文件(skip-worktree状态中的文件管理)
  • HiveWE:魔兽争霸III地图编辑器的现代化革命,让创作效率提升10倍!
  • 如何在3分钟内用OpenVINO AI插件让Audacity变身专业音频工作室
  • 实现 OpenClaw 跨平台联动,详细配置与实操演示
  • 文件系统-3-IO性能测试工具-1-fio-1-理论简介 - Hello
  • 用了 AI Coding 半年,代码量翻倍但维护变难:我们团队的「技术债决策矩阵」
  • 往复式洗车机常见问题全面解答(2026最新版) - 资讯纵览
  • B站直播推流码获取终极指南:突破官方限制的专业直播解决方案
  • 猫抓cat-catch:5分钟快速上手的浏览器视频下载终极指南
  • 【2026年06月】回收石墨换热器厂家优选指南回收废碳棒,回收石墨粉,回收石墨换热器优质企业推荐 - 多才菠萝
  • Kinetis KL14低功耗设计实战:从电气特性到睡眠模式深度解析
  • 定制碳纤维滤芯厂家性能、定制与服务三维对比 - 起跑123
  • AI 技术改变英语学习的方式
  • 甲级乙级防火玻璃门适用场所区分,规范安装要求详解
  • 微信小程序投票系统源码包:含视频上传、虚拟礼物打赏、分组PK功能