题意:
给你N个串,然后给出每个串在所求串的起始位置,让你求这个串,并且保证字典序最小。
思路:
读完题发现!怎么那么简单???
我想的就是对每个位置记录以该位置为起点的最长串,记录输入ID和长度。
然后队友说你串怎么存啊?
String啊???
会超时么???
不知道…
然后具体写的时候,发现在构造的时候,比如(以该位置为起点的最长串的长度):
46
代表第0位置起始是4长度,到了第1位置起始是6长度,在构造到第1位置的时候要以第1位置起点串来构造。具体我写了个DFS。
队友代码 T 了,死于cin,然后发现字符串不要一个一个字符输出,慢。
其实对于这种判断不好输入的难道不应该写个“输入挂”??
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e7+10;
int len[N];
string ss[100010];
struct asd{
int pos;
int id;
}q[N];
bool vis[N];
int Max;
char s[N], ans[N];
void DFS(int x){
int temp;
int pp;
pp = x + len[x] - 1;
// printf("%d %d\n",x, pp);
for(int i=x,k = 0;i<=pp;i++, k++){
temp = i + len[i] - 1;
if(temp > pp){
DFS(i);
break;
}
vis[i] = true;
ans[i] = ss[q[x].id][k];
}
}
int main(){
Max = 0;
memset(len,0,sizeof(len));
int n, temp, k, x;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>ss[i];
temp = ss[i].length();
scanf("%d",&k);
for(int j=0;j<k;j++){
scanf("%d", &x);
x--;
if(temp > len[x]){
len[x] = temp;
q[x].pos = temp;
q[x].id = i;
Max = max(x + temp - 1, Max);
}
}
}
// for(int i=0;i<=Max;i++)
// {
// printf("%d ",len[i]);
// }
// puts("");
// printf("%d\n",Max);
memset(vis, false, sizeof(vis));
for(int i = 0; i<= Max;i++){
if(vis[i]) continue;
DFS(i);
}
for(int i=0;i<=Max;i++){
if(vis[i]) printf("%c",ans[i]);
else printf("a");
}
puts("");
return 0;
}