题意:
给出几个子串以及他们在原字符串中几个出现位置(不一定是所有的),问字典序最小的原字符串。
思路:
把他给的字符暴力填充,用并查集维护,减小重复填充,维护一个结尾,结尾前没有填的地方都填a
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<unordered_map>
#define mod (1000000007)
using namespace std;
typedef long long ll;
const int maxn = 3e6 + 5;
const int inf = 0x3f3f3f3f;
ll n;
int f[maxn];
char ans[maxn],ss[maxn];
int getf(int x){
return f[x]==x?x:f[x]=getf(f[x]);
}
int main() {
int n,k,ed=0,num;
scanf("%d",&n);
for(int i=0;i<=2e6+10;i++)f[i]=i,ans[i]=0;
for(int i=0;i<n;i++){
scanf("%s%d",ss,&k);
int len=strlen(ss);
for(int j=0;j<k;j++){
scanf("%d",&num);
ed=max(ed,len+num);
int x=getf(num);
if(x-num>=len)continue;
for(;x-num<len;x=f[x]){
ans[x]=ss[x-num];
f[x]=getf(x+1);
}
}
}
for(int i=1;i<ed;i++)ans[i]==0?ans[i]='a':1;
puts(ans+1);
return 0 ;
}