博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P4218 [CTSC2010]珠宝商(后缀自动机+点分治)
阅读量:6076 次
发布时间:2019-06-20

本文共 1343 字,大约阅读时间需要 4 分钟。

 

这题思路太清奇了……->

1 //minamoto  2 #include
3 #include
4 #include
5 #include
6 #include
7 #define ll long long 8 using namespace std; 9 inline int read(){ 10 #define num ch-'0' 11 char ch;bool flag=0;int res; 12 while(!isdigit(ch=getchar())) 13 (ch=='-')&&(flag=true); 14 for(res=num;isdigit(ch=getchar());res=res*10+num); 15 (flag)&&(res=-res); 16 #undef num 17 return res; 18 } 19 template
inline bool cmax(T&a,const T&b){ return a
=2;--i){ 56 p=a[i]; 57 cnt[fa[p]]+=cnt[p]; 58 son[fa[p]][s[le[p]-l[fa[p]]]]=p; 59 } 60 } 61 void mark(int u,int fa,int now,int len){ 62 if(!now) return; 63 if(len==l[now]) now=son[now][str[u]-'a']; 64 else if(s[le[now]-len]!=str[u]-'a') now=0; 65 if(!now) return; 66 ++tag[now]; 67 for(int i=head[u];i;i=Next[i]){ 68 int v=ver[i]; 69 if(v!=fa&&!vis[v]) mark(v,u,now,len+1); 70 } 71 } 72 inline void push(){ for(int i=1;i<=tot;++i) tag[a[i]]+=tag[fa[a[i]]];} 73 }sam1,sam2; 74 void findrt(int u,int fa){ 75 sz[u]=1,son[u]=0; 76 for(int i=head[u];i;i=Next[i]){ 77 int v=ver[i]; 78 if(v!=fa&&!vis[v]) 79 findrt(v,u),sz[u]+=sz[v],cmax(son[u],sz[v]); 80 } 81 cmax(son[u],size-sz[u]); 82 if(!rt||son[u]

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9648945.html

你可能感兴趣的文章
Linux下Java调试方法
查看>>
究竟为什么开发者首选 iOS ?
查看>>
渲染图片
查看>>
vrrp hsrp在企业网中的应用
查看>>
关于js 的typeof运算符
查看>>
有趣的数(动态规划)
查看>>
OCX注册错误:请确保该二进制存储在指定的路径中
查看>>
linux系统编程之进程(四):进程退出exit,_exit区别即atexit函数
查看>>
企业网站为什么要转型营销型网站
查看>>
CocoaPods + 自定义静态库 -> 多工程连编
查看>>
WAF产品
查看>>
我的友情链接
查看>>
为Dll重新构造Lib
查看>>
EXCEL如何知道今天是第几周
查看>>
经典JDBC DAOFactory类实现
查看>>
为什么要使用ZooKeeper
查看>>
BtrFS:下一代GNU/Linux文件系统
查看>>
Redis从库不能同步报Can’t save in background: fork: Cannot allocate memory错误
查看>>
rsync详解
查看>>
android 面向对象数据库 db40使用demo
查看>>