zoukankan      html  css  js  c++  java
  • [ZJOI2015]诸神眷顾的幻想乡

    III.[ZJOI2015]诸神眷顾的幻想乡

    假如这棵树是定根的,那么其就可以被看作一棵trie,trie上本质不同子串数可以直接被建立广义SAM解决;但是这棵树不定根,路径可能拐弯,咋办呢?

    发现,其保证叶子数量 \(\leq20\)。这就意味着我们可以将以每个叶子为根所形成的trie并在一起形成一个大trie,此trie的节点数不大于 \(20n\),然后对大trie跑SAM即可。时间复杂度 \(O(20nm)\)

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    int n,m;
    namespace TR{//both for ordinary tree and for trie
    	vector<int>v[100100];
    	int cnt=1;
    	int col[100100],in[100100];
    	struct Trie{
    		int ch[10],id;
    	}t[2000100];
    	void dfs(int x,int fa,int FA){
    		if(!t[FA].ch[col[x]])t[FA].ch[col[x]]=++cnt;
    		for(auto y:v[x])if(y!=fa)dfs(y,x,t[FA].ch[col[x]]);
    	}
    	void init(){
    		for(int i=1;i<=n;i++)scanf("%d",&col[i]);
    		for(int i=1,x,y;i<n;i++)scanf("%d%d",&x,&y),v[x].push_back(y),v[y].push_back(x),in[x]++,in[y]++;
    		for(int i=1;i<=n;i++)if(in[i]==1)dfs(i,0,1);
    	}
    }
    namespace SAM{
    	int cnt=1;
    	struct Suffix_Automaton{
    		int ch[10],len,fa;
    	}t[4000100];
    	int Add(int x,int c){
    		int xx=++cnt;t[xx].len=t[x].len+1;
    		for(;x&&!t[x].ch[c];x=t[x].fa)t[x].ch[c]=xx;
    		if(!x){t[xx].fa=1;return xx;}
    		int y=t[x].ch[c];
    		if(t[y].len==t[x].len+1){t[xx].fa=y;return xx;}
    		int yy=++cnt;t[yy]=t[y];
    		t[yy].len=t[x].len+1;
    		t[xx].fa=t[y].fa=yy;
    		for(;x&&t[x].ch[c]==y;x=t[x].fa)t[x].ch[c]=yy;
    		return xx;
    	}
    	queue<int>q;
    	void build(){
    		q.push(1);
    		TR::t[1].id=1;
    		while(!q.empty()){
    			int x=q.front();q.pop();
    			for(int i=0;i<m;i++)if(TR::t[x].ch[i])TR::t[TR::t[x].ch[i]].id=Add(TR::t[x].id,i),q.push(TR::t[x].ch[i]);
    		}
    	}
    }
    using namespace SAM;
    ll res;
    int main(){
    	scanf("%d%d",&n,&m);
    	TR::init();
    	build();
    	for(int i=1;i<=cnt;i++)res+=t[i].len-t[t[i].fa].len;
    	printf("%lld\n",res);
    	return 0;
    }
    

  • 相关阅读:
    修改linux资源限制
    Windows 建立链接
    Java & ant环境变量配置
    Linux 配置IP
    Spring-MVC 访问静态资源
    Maven 安装与配置
    OIM同步OID(OID-Connector 9.0.4.12)
    Connector|OIM向IBM TDS推送账号(LDAP3)
    TopFreeTheme精选免费模板【20130704】
    30+简约和平铺的WordPress复古主题
  • 原文地址:https://www.cnblogs.com/Troverld/p/14605669.html
Copyright © 2011-2022 走看看