bzoj 1195 [HNOI2006] cadena de bus más corta voltaje similar a bfs más corto autómata de CA

ENLACE: cadena femenina más corta

Buscando el problema de la cadena madre. No apto para SAM.

Puede simplificar el problema primero y considerar que las n cadenas dadas no tienen una relación de inclusión.

Entonces solo hay dos cadenas que se pueden unir para indicar que otra cadena o el sufijo de una cadena determinada se pueden usar como prefijo de otra cadena.

La situación actual puede ser más complicada.

Observar las dos situaciones anteriores es fácil para los autómatas de CA para resolver problemas similares.

Cuando se ejecuta en un autómata de CA, puede tomar prestado el sufijo de otra cadena como su propio prefijo.

Considerando el establecimiento de un autómata de CA, requerimos una ruta para que pasen todos los nodos de terminación en el autómata de CA.

Por supuesto, también hay casos especiales en los que se pasa el nodo con el nodo de terminación como el fallo o el nodo con el nodo como el fallo.

Considere cómo encontrar el camino más corto.

Se puede encontrar que este es un problema de cortocircuito. Ejecute la ruta más corta como un gráfico en capas.

Los dos casos anteriores pueden satisfacerse porque se ejecutan en el gráfico trie del autómata de CA.

Considere el orden lexicográfico para seleccionar el nodo con el orden lexicográfico más pequeño cada vez.

Tenga en cuenta que es necesario preprocesar la matriz s [x] para representar el conjunto de todos los nodos de terminación representados por el nodo X. Tenga en cuenta que las s del puntero de error pueden pasarse por alto.

const int MAXN=610,maxn=1<<12;
int n,cnt,maxx;
char a[13][MAXN],b[MAXN],ans[MAXN];
int s[MAXN],q[1500010],vis[MAXN][maxn],pre[MAXN][maxn],w[1500010];
struct wy{int ch[26];int fail;}t[MAXN];

inline void insert(int x)
{
	int len=strlen(a[x]+1);
	int p=0;
	rep(1,len,i)
	{
		int w=a[x][i]-'A';
		if(!t[p].ch[w])t[p].ch[w]=++cnt;
		p=t[p].ch[w];b[p]=a[x][i];
	}
	s[p]=s[p]|(1<<(x-1));
}

inline void get_fail()
{
	int l=0,r=0;
	rep(0,25,i)if(t[0].ch[i])q[++r]=t[0].ch[i];
	while(++l<=r)
	{
		int x=q[l];
		rep(0,25,i)
		{
			int tn=t[x].ch[i];
			if(tn)fail(tn)=t[fail(x)].ch[i],s[tn]|=s[t[fail(x)].ch[i]],q[++r]=tn;
			else t[x].ch[i]=t[fail(x)].ch[i];
		}
	}
}

inline void bfs()
{
	int l=0,r=0;q[++r]=0;
	vis[0][0]=0;w[r]=0;
	while(++l<=r)
	{
		int x=q[l];
		int xx=w[l];
		rep(0,25,i)
		{
			int tn=t[x].ch[i];
			if(tn)
			{
				int ss=s[tn]|xx;
				if(vis[tn][ss]==-1)
				{
					pre[tn][ss]=l;
					vis[tn][ss]=vis[x][xx]+1;
					q[++r]=tn;w[r]=ss;
					if(ss==maxx)
					{
						int w1=tn,w2=ss;
						while(vis[tn][ss])
						{
							ans[vis[tn][ss]]=b[w1];
							--vis[tn][ss];
							int s1=q[pre[w1][w2]];
							int s2=w[pre[w1][w2]];
							w1=s1;w2=s2;
						}
						printf("%s",ans+1);
						return;
					}
				}
			}
		}
	}
}

int main()
{
	freopen("1.in","r",stdin);
	gt(n);maxx=(1<<n)-1;
	rep(1,n,i)gc(a[i]),insert(i);
	get_fail();
	memset(vis,-1,sizeof(vis));
	bfs();return 0;
}

Supongo que te gusta

Origin www.cnblogs.com/chdy/p/12723043.html
Recomendado
Clasificación