【[USACO17DEC]Standing Out from the Herd】
不会广义\(SAM\)啊
但信仰插入特殊字符就可以搞定一切了
我们先把所有的串搞在一起建出一个\(SAM\),记得在中间插入特殊字符
对于\(parent\)树上的一个节点,只有当其\(endpos\)集合中的所有元素都来自于同一个串的时候我们才对它进行统计
所以我们需要维护一个\(parent\)树上子树最大值和最小值,这样我们就能很快的判断这个\(endpos\)是否合法了
但是非常棘手的一类情况是我们插进去的特殊字符,显然\(SAM\)里有一些奇奇怪怪的子串中含有特殊字符
那也好办,我们存好每个串的起始位置只要那些没有跨越特殊字符的就好了
#include<iostream>
#include<cstring>
#include<cstdio>
#define maxn 200005
#define re register
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
struct E{int v,nxt;} e[maxn];
char S[maxn];
int m,n,lst=1,cnt=1,num;
int len[maxn],fa[maxn],son[maxn][27],mx[maxn],ml[maxn];
int f[maxn],head[maxn],d[maxn],Ans[maxn],li[maxn];
inline void add(int x,int y) {e[++num].v=y;e[num].nxt=head[x];head[x]=num;}
void dfs(int x) {
for(re int i=head[x];i;i=e[i].nxt)
dfs(e[i].v),mx[x]=max(mx[e[i].v],mx[x]),ml[x]=min(ml[e[i].v],ml[x]),d[x]|=d[e[i].v];
}
inline void ins(int c,int o)
{
int f=lst,p=++cnt; lst=p;
len[p]=len[f]+1,mx[p]=ml[p]=o;
if(c==26) d[p]=1;
while(f&&!son[f][c]) son[f][c]=p,f=fa[f];
if(!f) {fa[p]=1;return;}
int x=son[f][c];
if(len[f]+1==len[x]) {fa[p]=x;return;}
int y=++cnt;
len[y]=len[f]+1,fa[y]=fa[x],fa[x]=fa[p]=y;
for(re int i=0;i<27;i++) son[y][i]=son[x][i];
while(f&&son[f][c]==x) son[f][c]=y,f=fa[f];
}
int main()
{
memset(ml,20,sizeof(ml));
scanf("%d",&m);
for(re int i=1;i<=m;i++)
{
scanf("%s",S+1);
int len=strlen(S+1);li[i]=n+1;
for(re int j=1;j<=len;j++) ins(S[j]-'a',++n),f[n]=i;
ins(26,++n);
}
for(re int i=2;i<=cnt;i++) add(fa[i],i);
dfs(1);
for(re int i=2;i<=cnt;i++)
{
if(d[i]) continue;
if(f[mx[i]]!=f[ml[i]]) continue;
int minlen=len[fa[i]]+1;
if(f[mx[i]-minlen+1]!=f[mx[i]]) continue;
if(f[mx[i]-len[i]+1]==f[mx[i]]) Ans[f[mx[i]]]+=len[i]-len[fa[i]];
else Ans[f[mx[i]]]+=mx[i]-li[f[mx[i]]]-minlen+2;
}
for(re int i=1;i<=m;i++) printf("%d\n",Ans[i]);
return 0;
}
【[USACO17DEC]Standing Out from the Herd】的更多相关文章
- 后缀自动机再复习 + [USACO17DEC] Standing Out from the Herd
here:https://oi-wiki.org/string/sam/ 下面转自 KesdiaelKen的雷蒻论坛 来个广义后缀自动机模板题 [USACO17DEC]Standing Out fro ...
- 【LuoguP4081】[USACO17DEC]Standing Out from the Herd
题目链接 题意 给定多个字符串,每个串中仅在该串中出现的本质不同的子串个数. Sol 多串匹配想到用广义SAM. 之后从串的匹配角度不是很好做.发现一个本质不同的串最多只会贡献到一个串的答案里. 那么 ...
- P4081 [USACO17DEC]Standing Out from the Herd P
知识点: 广义 SAM 原题面 Luogu 「扯」 随便「口胡」一下居然「过」了. 比较考验「代码能力」,第一次感觉「大模拟」没有白写((( 还有这个「符号」实在是太「上头」了. 前置知识 在线构造广 ...
- P4081 [USACO17DEC]Standing Out from the Herd
思路 对所有串建立广义SAM,之后记录SZ,统计本质不同子串时只统计SZ=1的即可 代码 #include <cstdio> #include <algorithm> #inc ...
- [USACO17DEC]Standing Out from the Herd(广义后缀自动机)
题意 定义一个字符串的「独特值」为只属于该字符串的本质不同的非空子串的个数.如 "amy" 与 “tommy” 两个串,只属于 "amy" 的本质不同的子串为 ...
- [洛谷P4081][USACO17DEC]Standing Out from the Herd
题目大意:给你$n$个字符串,对每个字符串求出只在这个字符串中出现的字串的个数 题解:先建广义$SAM$,然后对每个点统计一下它的子树中是不是都是在同一个字符串中的,是的话,就把这个点标成这一个字符串 ...
- Luogu4081 USACO17DEC Standing Out from the Herd(广义后缀自动机)
建出广义SAM,通过parent树对每个节点求出其是否仅被一个子串包含及被哪个包含. 写了无数个sam板子题一点意思都没啊 #include<bits/stdc++.h> using na ...
- 【BZOJ5137】Standing Out from the Herd(后缀自动机)
[BZOJ5137]Standing Out from the Herd(后缀自动机) 题面 BZOJ 洛谷 题解 构建广义后缀自动机 然后对于每个节点处理一下它的集合就好了 不知道为什么,我如果按照 ...
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
[199-Binary Tree Right Side View(从右边看二叉树] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 代码下载[https://github.co ...
随机推荐
- 3.数据校验和SpringEL
1.数据验证 数据验证不应该被限定在web层去处理,他应该在任何需要做数据验证的地方做验证: 基于以上考虑,Spring设计了一个既方便又可以在所有层使用的Validator接口 Spring提供了V ...
- Windows下 virtualenv 使用
Windows下 virtualenv 使用 win python virtualenv 首先在电脑上安装两个不同版本的python mkvirtualenv --python C:\Python34 ...
- PHP、thinkPHP5.0开发网站文件管理功能(一)显示文件
显示文件用到的函数有 1.urlencode($str):编码URL字符串,便于将字符串编码并将其用于URL的请求部分 2.urldecode($str):解码已经编码的URL字符串,返回解码后的字符 ...
- Linux执行.sh文件Permission denied
执行sh文件报没有权限: 看下该文件的权限: 缺少执行的权限,直接加上吧: test.sh 权限加上去了,可以执行sh文件了 若用 chmod 4755 filename 可使此程序具有root的权限
- Xshell上Linux上传下载文件
Xshell上的Linux想要进行文件的上传和下载可以使用以下命令: #rz //将本地的文件上传到Linux服务器,执行后会弹出选择文件的框 #sz filename //将 filename 这个 ...
- docker 安装的centos7.4中无法识别文件中的中文
在容器内执行命令: 命令: yum -y install kde-l10n-Chinese && yum -y reinstall glibc-common 命令: localedef ...
- css 断行省略号,隐藏,fixed定位
text-overflow(clip | elipsis)(显示省略号| 不显示省略号) white-space:nowrap 强制文字不断行 word-break:break-all; ...
- maya2013安装失败如何卸载重装
AUTODESK系列软件着实令人头疼,安装失败之后不能完全卸载!!!(比如maya,cad,3dsmax等).有时手动删除注册表重装之后还是会出现各种问题,每个版本的C++Runtime和.NET f ...
- (转)blkid命令 获取文件系统类型、UUID
blkid命令 获取文件系统类型.UUID 原文:http://www.cnblogs.com/dkblog/archive/2011/08/30/2159630.html 在Linux下可以使用b ...
- 关于花瓣网header条的思考
最近忙着俱乐部招新的事情,每一次培训都会给学员布置作业,但是作业积累在手上并没有长久的保存价值,于是萌生了一个创建俱乐部网站平台的想法.为了充当好PM这个角色,学习了Axure软件的用法,并且首次制作 ...