1. 程式人生 > >Codeforces C - String Reconstruction

Codeforces C - String Reconstruction

pre div als log ++ codeforce tdi 父親 span

C - String Reconstruction

方法一:把確定的點的父親節點設為下一個點,這樣訪問過的點的根節點都是沒訪問過的點。

代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char s[N],res[N*2];
int fa[N*2];
int Find(int x)
{
    return x==fa[x]?x:fa[x]=Find(fa[x]);
}
int main()
{
    for(int i=0;i<N*2;i++)fa[i]=i;
    int n,t,x;
    scanf(
"%d",&n); int ml=0; for(int i=0;i<n;i++) { scanf("%s",s); scanf("%d",&t); int l=strlen(s); while(t--) { scanf("%d",&x); ml=max(ml,l+x-1); int y=x; while((y=Find(y))<=l+x-1) { res[y]
=s[y-x]; fa[y]=y+1; } } } for(int i=1;i<=ml;i++)if(!res[i])res[i]=a; puts(res+1); return 0; }

方法二:把所有點放進set容器裏,拜訪過的點就刪掉。

代碼:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
char s[N],res[N*2];
set<int>ss;
int main()
{
    ios::sync_with_stdio(
false); cin.tie(0); for(int i=1;i<N*2;i++)ss.insert(i); int n,t,a; cin>>n; int ml=0; for(int i=0;i<n;i++) { cin>>s; cin>>t; int l=strlen(s); while(t--) { cin>>a; while(1) { set<int>::iterator it=ss.lower_bound(a); if(it==ss.end()||*it-a>=l)break; ml=max(ml,*it); res[*it]=s[*it-a]; ss.erase(it); } } } for(int i=1;i<ml+1;i++)if(!res[i])res[i]=a; puts(res+1); return 0; }

Codeforces C - String Reconstruction