Code: #include <map> #include <vector> #include <queue> #include <cstdio> #include <cstring> #include <algorithm> #define N 400003 #define setIO(s) freopen(s".in","r",stdin) using namespace std; char S[N]; int n,m,rt[N<<1]; namespace Trie { int id[N],tim; struct Node { map<int,int>ch; int siz,dfn,top,son,fa; }t[N]; void dfs1(int u) { t[u].siz=1; for(int i=0;i<27;++i) if(t[u].ch.count(i)) { int v=t[u].ch[i]; t[v].fa=u,dfs1(v),t[u].siz+=t[v].siz; if(!t[u].son||t[v].siz>t[t[u].son].siz) t[u].son=v; } } void dfs2(int u,int tp) { t[u].top=tp; t[u].dfn=++tim; if(t[u].son) dfs2(t[u].son,tp); for(int