题意:告诉你一些字符串的信息,要求你重组并输出字典序最小的这个字符串,告诉你的信息是,某个子串在某几个位置出现,保证给的信息不冲突
解答:暴力!但是!要注意重复地位置要跳过,不然会超时!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string.h>
#include<cmath>
const int MAXN = 2000100;
char s[MAXN];
int ss[MAXN];
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
memset(ss,0,sizeof(ss));
int m;
int l = 0;
char tmp[MAXN];
while(n--)
{
scanf("%s",tmp);
int len = strlen(tmp);
scanf("%d",&m);
int t;
int tt = -len;
while(m--)
{
scanf("%d",&t);
for(int i = max(0,tt+len-t);i < len;i++)
{
if(ss[i+t-1])
continue;
ss[i+t-1] = 1;
s[i+t-1] = tmp[i];
}
tt = t;
if(m==0)
l = max(len + t - 1,l);
}
}
for(int i = 0;i < l;i++)
{
if(ss[i] == 0)
printf("a");
else
printf("%c",s[i]);
}
printf("\n");
}
return 0;
}