当前位置: 首页 > 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.zskr.cn/news/1494460.html

相关文章:

  • 猫抓浏览器扩展:一站式网页视频资源下载解决方案完全指南
  • 嵌入式系统设计:从数据手册到实战,解析KL82模拟外设与电气规格
  • 3Tops NPU + 4核高性能架构:灵眸科技EASY-EAI-PI2开发板,为边缘AI开启“easy模式”
  • 屈光发育档案:一个儿童视力数据追踪系统——以及它为什么比单次验光能提供更多判断依据
  • UniApp扫码功能商业化升级指南:如何像支付宝/微信一样‘秒扫’(基于mPaaS插件)
  • git查看远端文件(skip-worktree状态中的文件管理)
  • 投资金条变现攻略!9家机构横评,2026沈阳大盘价贴合度真实排行 - 奢侈品回收评测
  • STM32多型号串口DMA收发工程包:空闲中断+环形缓冲+RTOS兼容方案
  • B站直播推流码获取终极指南:突破官方限制的专业直播解决方案
  • 往复式洗车机常见问题全面解答(2026最新版) - 资讯纵览
  • 用了 AI Coding 半年,代码量翻倍但维护变难:我们团队的「技术债决策矩阵」
  • 【2026年06月】回收石墨换热器厂家优选指南回收废碳棒,回收石墨粉,回收石墨换热器优质企业推荐 - 多才菠萝
  • MATLAB黑油模拟实战包:从单相到三相、含SPE标准算例与多段井建模
  • 2026年猫咪驱虫药哪个靠谱:权威测评精选攻略 - 思溯深度专栏
  • 防错法(Poka-Yoke)在电子行业专项应用
  • 2026零基础学雅思选什么软件?适合零基础考生的APP推荐 - 品牌2026
  • MicroG完整指南:华为设备用户必备的免费GMS替代方案终极教程
  • i.MX 6电气特性深度解析:从电源管理到高速接口的设计避坑指南
  • 深圳钻石回收水有多深?5家真实门店测评,拒绝套路压价 - 奢侈品交易观察员
  • i.MX 6SoloX硬件设计实战:特殊信号、电源与时钟系统设计要点
  • 如何高效管理Steam游戏成就:完整开源工具使用指南
  • 主流低代码管理平台TOP10(2026版)
  • 钢结构工程角焊缝的构造要求有哪些?
  • LabVIEW滚动轴承故障诊断系统设
  • BiliTools跨平台哔哩哔哩工具箱:2026年最全面的B站视频下载解决方案
  • 【2026-06-08】挥洒余热
  • NXP IW693S无线组合芯片硬件设计:从封装到PCB的实战指南
  • Claude 4.5 的推理链路能追溯多深?用一个分布式一致性问题测了一下
  • 2026年近期驻马店市优秀翅片销售厂家综合能力深度剖析与选择指南 - 2026年企业资讯
  • Netsol mram存储器应用领域,mram存储器工作原理