maqz WA 60 pts

P2322 [HNOI2006] 最短母串问题

```cpp #include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; int n; char str[55]; int cnt,son[100005][26]; int tai,from[100005]; char edw[100005]; int fail[100005],dp[100005]; bool vis[100005][1<<12]; int top; char ans[100005]; inline void ins(int x) { int u=1; int len=strlen(str+1); for(int i=1;i<=len;i++) { int id=str[i]-'A'; if(son[u][id]==0) { son[u][id]=++cnt; } u=son[u][id]; } dp[u]|=1<<x-1; } inline void init() { queue<int> q; fail[1]=1; for(int i=0;i<26;i++) { int v=son[1][i]; if(v!=0) { fail[v]=1; q.push(v); } else { son[1][i]=1; } } while(!q.empty()) { int u=q.front(); q.pop(); int fiu=fail[u]; for(int i=0;i<26;i++) { int v=son[u][i]; if(v!=0) { fail[v]=son[fiu][i]; q.push(v); } else { son[u][i]=son[fiu][i]; } } } } int main() { scanf("%d",&n); cnt=1; for(int i=1;i<=n;i++) { scanf("%s",str+1); ins(i); } init(); queue<int> q,q2,q3; q.push(1); q2.push(0); q3.push(1); from[++tai]=1; while(!q.empty()) { int u=q.front(),nsta=q2.front(),nid=q3.front(); q.pop(); q2.pop(); q3.pop(); if(nsta==(1<<n)-1) { while(nid!=1) { ans[++top]=edw[nid]; nid=from[nid]; } break; } for(int i=0;i<26;i++) { int v=son[u][i]; int nxtdp=dp[v]|nsta; if(!vis[v][nxtdp]) { vis[v][nxtdp]=true; from[++tai]=nid; edw[tai]='A'+i; q.push(v); q2.push(nxtdp); q3.push(tai); } } } while(top>0) { printf("%c",ans[top--]); } printf("\n"); return 0; } ```
by lovely_ckj @ 2021-11-19 09:54:10


orz
by qsceszthn @ 2021-11-19 10:13:51


sto orz
by LC_535 @ 2021-11-19 10:24:11


您数组小了,from数组和edw数组要开到状态数,也就是600*(1<<12),我估计比100005大(因为我也是这样)
by __stick @ 2022-02-11 17:33:53


|