L3-2 还原文件
一份重要文件被撕成两半,其中一半还被送进了碎纸机。我们将碎纸机里找到的纸条进行编号,如图 1 所示。然后根据断口的折线形状跟没有切碎的半张纸进行匹配,最后还原成图 2 的样子。要求你输出还原后纸条的正确拼接顺序。
#include<iostream>
#include<vector>
#include<map>
#include<cstdio>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
const ll tt=103;
const ll MOD=1e10+1;
map<ll ,int> mp;
int a[maxn];
int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int m;scanf("%d",&m);
for(int i=1;i<=m;i++) {
int kk;scanf("%d",&kk);
ll v=0;
while(kk--)
{
int num;scanf("%d",&num);
v=(v*tt+num)%MOD;
}
//cout<<v<<endl;
mp[v]=i;
}
int cnt=m;
ll v=0;
for(int i=1;i<=n;i++)
{
v=(v*tt+a[i])%MOD;
//cout<<v<<endl;
if(mp[v]!=0)
{
printf("%d",mp[v]);
mp[v]=0;
cnt--;
if(cnt!=0) printf(" ");
v=0;
v=v*tt+a[i];
}
}
}