Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction
Posted 早知如此绊人心,何如当初莫相识。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction相关的知识,希望对你有一定的参考价值。
题意:给出各个字符串出现的起始位置,问整个的字符串是什么,(字典序最小)
思路:开始写的是用set+优先队列存取每个位置出现的最长字符串,然后遍历,爆内存。。。爆。。。内。。。存。。。我们可以用并查集,已经确认的位置他们并在一起,指向后面第一个没有被确认的(看代码理解吧)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=2e6+10; 4 5 int n,fa[N]; 6 char s[N],b[N]; 7 8 int Find(int x) { return fa[x]==x ? x : fa[x]=Find(fa[x]); } 9 int main(){ 10 int k; 11 scanf("%d",&n); 12 for(int i=1;i<=2000000;i++) { 13 fa[i]=i;b[i]=‘a‘; 14 } 15 int Max=0,x; 16 for(int i=1;i<=n;i++){ 17 scanf("%s%d",s+1,&k); 18 int len=strlen(s+1); 19 for(int j=1;j<=k;j++){ 20 scanf("%d", &x); 21 Max=max(Max, x+len-1); 22 int y=x; 23 while(y <= x+len-1) 24 { 25 b[y]=s[y-x+1]; 26 fa[y]=y+1;y=Find(y); 27 } 28 } 29 } 30 31 for(int i=1;i<=Max;i++) putchar(b[i]); 32 printf("\n"); 33 }
以上是关于Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) C. String Reconstruction的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #423 (Div. 2) A-C
Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水
Codeforces Round #423 (Div. 2)A B C D
Codeforces Round #423 (Div. 2, rated, based on VK Cup Finals) Problem A - B