[CodeForces]String Reconstruction

http://codeforces.com/contest/828/problem/C

并查集的神奇应用。

#include<bits/stdc++.h>
using namespace std;

const int maxn=10000005;
char s[maxn];
string ss[100000];
vector<int> g[100000];
int fa[maxn]; int findfa(int x) { if (fa[x]==x) return x; else return fa[x]=findfa(fa[x]); } void merge(int u,int v) { int f1=findfa(u); int f2=findfa(v); if (f1!=f2) { fa[f1]=f2; } } int main() { int n; scanf("%d",&n); int ma=0; for (int i=0;i<n;i++) { cin >>ss[i]; int k; scanf("%d",&k); int l=ss[i].length(); for (int j=0;j<k;j++) { int x; scanf("%d",&x); g[i].push_back(x); if (x+l-1>ma) ma=x+l-1; } } s[ma+1]=0; for (int i=0;i<=ma+1;i++) fa[i]=i; for (int i=0;i<n;i++) { for (int j=0;j<g[i].size();j++) { int p=g[i][j]; for (int k=findfa(p);k<=p+ss[i].length()-1;k=findfa(k+1)) { s[k]=ss[i][k-p]; merge(k,p+ss[i].length()); } } } for (int i=1;i<=ma;i++) if (s[i]==0) s[i]='a'; printf("%s",s+1); return 0; }

 

转载于:https://www.cnblogs.com/acmsong/p/8157340.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值