Advertisement
yicongli

T146T3

Mar 8th, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.21 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=100005;
  17.  
  18. int n;
  19.  
  20. inline char GetChar(){
  21.     char gc;
  22.     while(c<'a'||c>'z')gc;
  23.     return c;
  24. }
  25.  
  26. int ecnt;
  27. int fir[N];
  28. int nex[N<<1];
  29. int to[N<<1];
  30. char w[N<<1];
  31.  
  32. inline void addedge(int u,int v,char c){
  33.     nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  34.     nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
  35. }
  36.  
  37. int state;
  38. int len[N<<1];
  39. int trans[N<<1][26];
  40. int slink[N<<1];
  41. int root[N<<1];
  42.  
  43. inline int NewNode(int mx,int *tr,int su){
  44.     ++state;
  45.     len[state]=mx;
  46.     if(tr!=NULL)memcpy(trans[state],tr,26<<2);
  47.     slink[state]=su;
  48.     return state;
  49. }
  50.  
  51. inline int extend(int u,int c){
  52.     int t=NewNode(len[u]+1,NULL,0);
  53.     while(u&&!trans[u][c])trans[u][c]=t,u=slink[u];
  54.     if(!u){
  55.         slink[t]=1;
  56.         return t;
  57.     }
  58.     int v=trans[u][c];
  59.     if(len[v]==len[u]+1){
  60.         slink[t]=v;
  61.         return t;
  62.     }
  63.     int x=NewNode(len[u]+1,trans[v],slink[v]);
  64.     slink[t]=slink[v]=x;
  65.     while(u&&trans[u][c]==v)trans[u][c]=x,u=slink[u];
  66.     return t;
  67. }
  68.  
  69. int fa[N];
  70. int siz[N];
  71. int son[N];
  72. int dep[N];
  73. char ch[N];
  74.  
  75. void dfs1(int x,int f){
  76.     fa[x]=f;
  77.     siz[x]=1;
  78.     dep[x]=dep[f]+1;
  79.     for(int i=fir[x];i;i=nex[i]){
  80.         int v=to[i];
  81.         if(v==f)continue;
  82.         ch[v]=w[i];
  83.         dfs1(v,x);
  84.         siz[x]+=siz[v];
  85.         if(siz[son[x]]<siz[v])son[x]=v;
  86.     }
  87. }
  88.  
  89. int dfs_clock;
  90. int dfn[N];
  91. int top[N];
  92. int ptn[N];
  93.  
  94. void dfs2(int x,int t){
  95.     top[x]=t;
  96.     dfn[x]=++dfs_clock;
  97.     ptn[dfs_clock]=x;
  98.     if(!son[x])return ;
  99.     dfs2(son[x],t);
  100.     for(int i=fir[x];i;i=nex[i]){
  101.         int v=to[i];
  102.         if(v==fa[x]||v==son[x])continue;
  103.         dfs2(v,v);
  104.     }
  105. }
  106.  
  107. int tot;
  108. int ls[N*50];
  109. int rs[N*50];
  110. int sum[N*50];
  111.  
  112. void insert(int &rt,int l,int r,int x){
  113.     if(!rt)rt=++tot;
  114.     ++sum[rt];
  115.     if(l==r)return ;
  116.     int mid=(l+r)>>1;
  117.     if(x<=mid)insert(ls[rt],l,mid,x);
  118.     else insert(rs[rt],mid+1,r,x);
  119. }
  120.  
  121. int query(int rt,int l,int r,int x,int y){
  122.     if(!rt)return 0;
  123.     if(x<=l&&r<=y)return sum[rt];
  124.     int mid=(l+r)>>1;
  125.     if(y<=mid)return query(ls[rt],l,mid,x,y);
  126.     if(x>mid)return query(rs[rt],mid+1,r,x,y);
  127.     return query(ls[rt],l,mid,x,y)+query(rs[rt],mid+1,r,x,y);
  128. }
  129.  
  130. void merge(int &x,int y){
  131.     if(!x||!y){
  132.         x|=y;
  133.         return ;
  134.     }
  135.     merge(ls[x],ls[y]);
  136.     merge(rs[x],rs[y]);
  137.     sum[x]+=sum[y];
  138. }
  139.  
  140. void dfs3(int x,int lst){
  141.     int t;
  142.     if(x==1)t=NewNode(0,NULL,0);
  143.     else {
  144.         t=extend(lst,ch[x]-'a');
  145.         insert(root[t],1,n,dfn[x]);
  146.     }
  147.     if(!son[x])return ;
  148.     dfs3(son[x],t);
  149.     for(int i=fir[x];i;i=nex[i]){
  150.         int v=to[i];
  151.         if(v==fa[x]||v==son[x])continue;
  152.         dfs3(v,t);
  153.     }
  154. }
  155.  
  156. inline int LCA(int u,int v){
  157.     while(top[u]!=top[v]){
  158.         if(dep[top[u]]<dep[top[v]])swap(u,v);
  159.         u=fa[top[u]];
  160.     }
  161.     return dep[u]<dep[v]?u:v;
  162. }
  163.  
  164. inline int k_lst(int u,int v,int k){
  165.     if(dep[u]-dep[v]<k)return 0;
  166.     int lst;
  167.     while(top[u]!=top[v]){
  168.         if(dep[u]-dep[v]<k)break;
  169.         lst=top[u],u=fa[top[u]];
  170.     }
  171.     if(dep[u]-dep[v]<k)return ptn[dfn[lst]+k-(dep[u]-dep[v])-1];
  172.     else return ptn[dfn[v]+k];
  173. }
  174.  
  175. int Next[N];
  176.  
  177. inline int KMP(char *s,int lenS,char *t,int lenT){
  178.     for(int i=2,j=0;i<=lenT;++i){
  179.         while(j&&t[i]!=t[j+1])j=Next[j];
  180.         if(t[i]==t[j+1])++j;
  181.         Next[i]=j;
  182.     }
  183.     int ret=0;
  184.     for(int i=1,j=0;i<=lenS;++i){
  185.         while(j&&s[i]!=t[j+1])j=Next[j];
  186.         if(s[i]==t[j+1])++j;
  187.         if(j==lenT){
  188.             ++ret;
  189.             j=Next[j];
  190.         }
  191.     }
  192.     return ret;
  193. }
  194.  
  195. struct Query{
  196.     int id,x,y;
  197. };
  198.  
  199. vector<Query>Q[N<<1];
  200.  
  201. inline void putquery(int id,int u,int x,int y){
  202.     Q[u].push_back(Query{id,x,y});
  203. }
  204.  
  205. int ans[N];
  206.  
  207. char s[N];
  208.  
  209. inline void solve(int id,int u,int v,char *str){
  210.     int len=strlen(str+1);
  211.     int lca=LCA(u,v);
  212.     if(dep[u]-dep[lca]>=len){
  213.         int u0=k_lst(u,lca,len);
  214.         int A=1;
  215.         for(int i=len;i>=1;--i)A=trans[A][str[i]-'a'];
  216.         while(top[u]!=top[u0]){
  217.             putquery(id,A,dfn[top[u]],dfn[u]);
  218.             u=fa[top[u]];
  219.         }
  220.         putquery(id,A,dfn[u0],dfn[u]);
  221.         u=fa[u0];
  222.     }
  223.     if(dep[v]-dep[lca]>=len){
  224.         int v0=k_lst(v,lca,len);
  225.         int B=1;
  226.         for(int i=1;i<=len;++i)B=trans[B][str[i]-'a'];
  227.         while(top[v]!=top[v0]){
  228.             putquery(id,B,dfn[top[v]],dfn[v]);
  229.             v=fa[top[v]];
  230.         }
  231.         putquery(id,B,dfn[v0],dfn[v]);
  232.         v=fa[v0];
  233.     }
  234.     int m=dep[u]+dep[v]-2*dep[lca];
  235.     int p=0;
  236.     for(;u!=lca;u=fa[u])s[++p]=ch[u];
  237.     int q=m;
  238.     for(;v!=lca;v=fa[v])s[q--]=ch[v];
  239.     ans[id]=KMP(s,m,str,len);
  240.     return ;
  241. }
  242.  
  243. vector<int>G[N<<1];
  244.  
  245. void dfs4(int x){
  246.     for(int i=0;i<G[x].size();++i){
  247.         dfs4(G[x][i]);
  248.         merge(root[x],root[G[x][i]]);
  249.     }
  250.     for(int i=0;i<Q[x].size();++i){
  251.         ans[Q[x][i].id]+=query(root[x],1,n,Q[x][i].x,Q[x][i].y);
  252.     }
  253. }
  254.  
  255. int cnt[N];
  256. int ord[N<<1];
  257. char str[5000007];
  258.  
  259. int main(){
  260.     freopen("starry.in","r",stdin);
  261.     freopen("starry.out","w",stdout);
  262.     r(n);
  263.     for(int i=1;i<n;++i){
  264.         int u,v;r(u),r(v);
  265.         char c=GetChar();
  266.         addedge(u,v,c);
  267.     }
  268.     dfs1(1,0);
  269.     dfs2(1,1);
  270.     dfs3(1,0);
  271.     int q;r(q);
  272.     for(int i=1;i<=q;++i){
  273.         int u,v;r(u),r(v);
  274.         scanf("%s",str+1);
  275.         solve(i,u,v,str);
  276.     }
  277.     /*
  278.     for(int i=1;i<=state;++i)cnt[len[i]]++;
  279.     for(int i=1;i<=n;++i)cnt[i]+=cnt[i-1];
  280.     for(int i=state;i>=1;--i)ord[cnt[len[i]]--]=i;
  281.     for(int i=state;i>=1;--i){
  282.         int u=ord[i];
  283.         for(int j=0;j<Q[u].size();++j){
  284.             Query &x=Q[u][j];
  285.             ans[x.id]+=query(root[u],1,n,x.x,x.y);
  286.         }
  287.         merge(root[slink[u]],root[u]);
  288.     }
  289.     */
  290.     for(int i=2;i<=state;++i){
  291.         G[slink[i]].push_back(i);
  292.     }
  293.     dfs4(1);
  294.     for(int i=1;i<=q;++i)printf("%d\n",ans[i]);
  295. }
  296. /*
  297. 6
  298. 2 3 g
  299. 3 4 n
  300. 5 3 o
  301. 6 1 n
  302. 1 2 d
  303. 7
  304. 1 6 n
  305. 6 4 dg
  306. 6 4 n
  307. 2 5 og
  308. 1 2 d
  309. 6 5 go
  310. 2 3 g
  311.  
  312. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement