字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 843 Solved: 510
[Submit][Status][Discuss]
Description
幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日。
点),幽香就能看到一个长度为A到B之间路径上的所有粉丝的数目(包括A和B)的颜色序列。一开始大家打算让人一两个粉丝(注意:A,B和B,A是不同
的,他们形成的序列刚好相反,比如红绿蓝和蓝绿红)都来一次,但是有人指出这样可能会出现一些一模一样的颜色序列,会导致审美疲劳。
Input
第一行两个正整数n,c。表示空地数量和颜色数量。
Output
一行,输出一个整数,表示答案。
Sample Input
0 2 1 2 1 0 0
1 2
3 4
3 5
4 6
5 7
2 5
Sample Output
HINT
对于所有数据,1<=n<=100000, 1<=c<=10。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- const int maxn=;
- const int maxm=;
- long long ans;
- bool vis[maxm];
- int n,sumc,cntE,c[maxn];
- int fir[maxn],nxt[maxn<<],to[maxn<<];
- void addedge(int a,int b){
- nxt[++cntE]=fir[a];
- fir[a]=cntE;
- to[cntE]=b;
- }
- int st[maxm],topst;
- int CH[maxm][],pos[maxm];
- int fa[maxm],ch[maxm][],len[maxm];
- struct SAM{
- int cnt,last;
- SAM(){
- cnt=last=;
- }
- int Insert(int c){
- int p=last,np=last=++cnt;len[np]=len[p]+;
- while(p&&!ch[p][c])ch[p][c]=np,p=fa[p];
- if(!p)fa[np]=;
- else{
- int q=ch[p][c];
- if(len[p]+==len[q])
- fa[np]=q;
- else{
- int nq=++cnt;len[nq]=len[p]+;
- memcpy(ch[nq],ch[q],sizeof(ch[q]));
- fa[nq]=fa[q];fa[q]=fa[np]=nq;
- while(ch[p][c]==q)ch[p][c]=nq,p=fa[p];
- }
- }
- ans+=len[last]-len[fa[last]];
- return last;
- }
- }sam;
- struct Trie{
- int cnt,rt;
- Trie(){
- rt=cnt=;
- pos[rt]=;
- }
- void Insert(int &x,int p){
- vis[p]=true;
- if(!x)x=++cnt;
- for(int i=fir[p];i;i=nxt[i])
- if(!vis[to[i]])
- Insert(CH[x][c[to[i]]],to[i]);
- }
- void Construct(int x){
- for(int i=;i<sumc;i++)
- if(CH[x][i]){
- sam.last=pos[x];
- pos[CH[x][i]]=sam.Insert(i);
- }
- for(int i=;i<sumc;i++)
- if(CH[x][i])
- Construct(CH[x][i]);
- }
- }trie;
- int main(){
- #ifndef ONLINE_JUDGE
- freopen("zjoi15_substring.in","r",stdin);
- freopen("zjoi15_substring.out","w",stdout);
- #endif
- scanf("%d%d",&n,&sumc);
- for(int i=;i<=n;i++)
- scanf("%d",&c[i]);
- for(int i=,a,b;i<n;i++){
- scanf("%d%d",&a,&b);
- addedge(a,b);
- addedge(b,a);
- }
- for(int x=,tot=;x<=n;tot=,x++){
- for(int i=fir[x];i;i=nxt[i])tot+=;
- if(tot==)st[++topst]=x;
- }
- while(topst){
- memset(vis,,sizeof(vis));
- trie.Insert(CH[trie.rt][c[st[topst]]],st[topst]);
- topst-=;
- }
- trie.Construct(trie.rt);
- printf("%lld\n",ans);
- return ;
- }
字符串(广义后缀自动机):BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡的更多相关文章
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 [广义后缀自动机 Trie]
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1124 Solved: 660[Submit][S ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1017 Solved: 599[Submit][S ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机 后缀自动机 字符串
https://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机是一种可以处理好多字符串的一种数据结构(不像后缀自动机只有处理一到两种的时候比 ...
- BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡 ——广义后缀自动机
神奇的性质,叶子节点不超过20个. 然后把这些节点提出来构成一颗新树,那么这些树恰好包含了所有的情况. 所以直接广义后缀自动机. 然后统计本质不同的字符串就很简单显然了. #include <c ...
- BZOJ.3926.[ZJOI2015]诸神眷顾的幻想乡(广义后缀自动机)
题目链接 要对多个串同时建立SAM,有两种方法: 1.将所有串拼起来,中间用分隔符隔开,插入字符正常插入即可. 2.在这些串的Trie上建SAM.实际上并不需要建Trie,还是只需要正常插入(因为本来 ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(后缀自动机)
传送门 解题思路 因为叶节点不超过\(20\)个,所以可以枚举这些叶节点,并把这些节点当做根扫整棵树.可以证明所有的子串一定可以被便利到,然后可以对这些串建广义后缀自动机.\(dfs\)的时候要记录一 ...
- bzoj 3926 [Zjoi2015]诸神眷顾的幻想乡(SAM)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3926 [题意] 给定一棵树,每个节点都有相应的颜色,且保证叶子数不超过20,问 ...
- ●BZOJ 3926 [Zjoi2015]诸神眷顾的幻想乡
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3926题解&&代码: 后缀自动机,Trie树 如果以每个叶子为根,所有的子串一 ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡(广义后缀自动机 多串)
因为任何一条路径都可以看做某两个叶子节点之间路径的一部分,然后分别把20个叶节点当作根,把整棵树看作trie树,那么一条路径就能看作是从根到某个点这一条路的后缀,构建SAM就能维护不同子串的个数了. ...
随机推荐
- phpstorm 快捷方式 (备用)
常用快捷键 设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后“Copy”一份 ...
- NetworkOnMainThreadException
来自:http://www.2cto.com/kf/201402/281526.html NetworkOnMainThreadException extends RuntimeException j ...
- js获取上一个月、下一个月
/** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...
- Member var and Static var.
/* member variable and static variable: 1,invoke ways: member variable,also called 'instance' variab ...
- Bootstrap Table的例子(转载)
转载自:http://wenzhixin.net.cn/p/bootstrap-table/docs/examples.html#classes-table 使用的API: data1.json da ...
- 解决vim不能使用方向键和退格键问题
1.使用vi命令时,不能正常编辑文件,使用方向键时老是出现很多字母,或者退格键却变成方向键的功能 只要重装一下vi的依赖包即可完美解决vi编辑器方向键变字母的问题.rpm -e vim-enhance ...
- iOS7初体验(1)——第一个应用程序HelloWorld
iOS7 Beta已经发布了,迫不及待地下载了iOS 7及Xcode 5并体验了一下.先做一个简单的Hello World看看都有哪些变化吧. 1. 启动Xcode5-DP: 2. 从菜单选择File ...
- 微信小程序开发之入门篇(熟悉开发工具)
个人的每一篇博文都谈不上有什么技术含量,只是为了帮助不熟悉微信小程序开发的自己及他人提供一下思路.谢谢,下面开始! PS: 因为本人没有小程序的内测资格,所以所有的开发及Demo都是无AppId的,如 ...
- ubuntu12.04安装QQ2013
1.下载Longene QQ2013SP6 http://pan.baidu.com/s/1hq83fWo 2.安装 1)如果之前安装过旧版本需要先卸载(通过dpkg -l | grep qq查看). ...
- c# web 删除时弹出提示框
方法1: 在控件中增加属性 <asp:Button ID="btnSub" runat="server" Text="提交" oncl ...