题意:给你一些子字符串猜字符串
题解思路:路径压缩去找最右边没有被使用过的字符赋上字符即可
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int mx = 3e6+5;
int p[mx];
char s[mx];
char str[mx];
int find(int x){
return p[x] == x?x:p[x] = find(p[x]);
}
int main(){
int n,m,pos;
for(int i = 0; i < mx; i++)
p[i] = i;
memset(s,0,sizeof(s));
int MAXN = 0;
scanf("%d",&n);
while(n--){
scanf("%s",str);
scanf("%d",&m);
int len = strlen(str);
while(m--){
scanf("%d",&pos);
pos--;
MAXN = max(MAXN,pos+len);
for(int i = find(pos); i-pos<len; i = p[i] = find(i+1))
s[i] = str[i-pos];
}
}
for(int i = 0; i < MAXN; i++)
if(s[i] == 0)
putchar('a');
else
printf("%c",s[i]);
printf("\n");
return 0;
}