题意:求长度为1到n的相同子串出现的次数,输到小于2为止。

题解:

用sam做。

建机,算right集合,然后用r[i]更新长度为step[i]的子串出现次数,然后ans[i]=maxx(ans[i],ans[i+1])(长度更长的出现次数一定小于等于长度更短的。)

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; const int N=*;
int sl,cl,tot,last,step[N],pre[N],son[N][],in[N],r[N],c[N],ans[N];
bool vis[N];
char s[N];
queue<int> Q; int maxx(int x,int y){return x>y ? x:y;} int add_node(int x)
{
step[++tot]=x;
return tot;
} void clear()
{
memset(step,,sizeof(step));
memset(pre,,sizeof(pre));
memset(son,,sizeof(son));
memset(in,,sizeof(in));
memset(r,,sizeof(r));
tot=;add_node();last=;
} void extend(int ch)
{
int p=last,np=add_node(step[p]+);
while(p && !son[p][ch])
{
son[p][ch]=np;
in[np]++;
p=pre[p];
}
if(!p) pre[np]=;
else
{
int q=son[p][ch];
if(step[q]==step[p]+) pre[np]=q;
else
{
int nq=add_node(step[p]+);
for(int i=;i<=;i++)
if(son[q][i]) son[nq][i]=son[q][i],in[son[q][i]]++;
pre[nq]=pre[q];
pre[np]=pre[q]=nq;
while(p && son[p][ch]==q) in[q]--,in[nq]++,son[p][ch]=nq,p=pre[p];
}
}
last=np;
} void get_tp()
{
while(!Q.empty()) Q.pop();
memset(vis,,sizeof(vis));
Q.push();vis[]=;cl=;
while(!Q.empty())
{
int x=Q.front();c[++cl]=x;vis[x]=;Q.pop();
for(int i=;i<=;i++)
{
int y=son[x][i];
if(!y) continue;
in[y]--;
if(!in[y] && !vis[y]) vis[y]=,Q.push(y);
}
}
} void get_right()
{
int x=,ch;
for(int i=;i<=sl;i++)
{
ch=s[i]-'A'+;
x=son[x][ch];
r[x]++;
}
for(int i=cl;i>=;i--) r[pre[c[i]]]+=r[c[i]];
} void output(int x)
{
printf("x = %d pre = %d r = %d\n",x,pre[x],r[x]);
for(int i=;i<=;i++)
{
if(son[x][i]) printf("son %d = %d\n",i,son[x][i]);
}
printf("\n");
} int main()
{
freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int cas=;
while()
{
gets(s+);
sl=strlen(s+);
int l=;
for(int i=;i<=sl;i++)
if(s[i]>='A' && s[i]<='Z') s[++l]=s[i];
sl=l;
if(sl==) return ; clear();
for(int i=;i<=sl;i++) extend(s[i]-'A'+);
get_tp();
get_right();
memset(ans,,sizeof(ans));
for(int i=;i<=tot;i++) ans[step[i]]=maxx(ans[step[i]],r[i]); for(int i=;i<sl;i++) ans[i]=maxx(ans[i],ans[i+]); for(int i=;i<=sl;i++)
{
if(ans[i]<) break;
printf("%d\n",ans[i]);
}
printf("\n");
}
return ;
}

【uva11855-求长度为1到n的相同子串出现的次数】sam的更多相关文章

  1. LCS模板,求长度,并记录子串

    //LCS模板,求长度,并记录子串  //亦可使用注释掉的那些代码,但所用空间会变大 #include<iostream> #include<cstring> #include ...

  2. hiho#1449 重复旋律6 求长度为k的串最大次数 后缀自动机

    题目传送门 题目大意:求长度为k的串的最大次数,把k从1到length的所有答案全部输出. 思路: 这道题放在$SAM$里就是求长度$k$对应的所有$right$集中最大的大小. 我们以$aabab$ ...

  3. spoj 8222 NSUBSTR 求长度为x的子串中出现次数最大值 SAM

    题目大意 给一个字符串S 令F(x)表示S的所有长度为x的子串中 出现次数的最大值. 求F(1)..F(Length(S)) 分析 一个节点\(x\)的长度有\(~~(max(fa),max(x)]\ ...

  4. POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)

    Description A substring of a string T is defined as: T( i, k)= TiTi+1... Ti+k-1, 1≤ i≤ i+k-1≤| T|. G ...

  5. 求一字符串最长不重复字符子串的长度【Java 版】

    一. 前言 最近学习有点断断续续,整理的一些知识点要么不完整,要么完全没搞懂,不好拿上台面,还是先在草稿箱躺着吧.偶尔在浏览大牛博客http://coolshell.cn的时候,发现大牛业余时间也在做 ...

  6. poj 1743 男人八题之后缀数组求最长不可重叠最长重复子串

    Musical Theme Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 14874   Accepted: 5118 De ...

  7. SPOJ 1811 Longest Common Substring(求两个串的最长公共子串 || 或者n个串)

    http://www.spoj.com/problems/LCS/ 题目:求两个串的最长公共子串 参考:https://www.cnblogs.com/autoint/p/10345276.html: ...

  8. 长度为x的本质不同的串的出现次数 SPOJ - NSUBSTR 后缀自动机简单应用

    题意: 长度为x的本质不同的串的出现次数 题解: 先处理出每一个节点所对应的子串出现的次数 然后取max就好了 #include <set> #include <map> #i ...

  9. 求两个字符串的最长公共子串——Java实现

    要求:求两个字符串的最长公共子串,如“abcdefg”和“adefgwgeweg”的最长公共子串为“defg”(子串必须是连续的) public class Main03{ // 求解两个字符号的最长 ...

随机推荐

  1. Linq To Excel使用简介二

    目录: 1.常用方法介绍 2.查询符合条件的数据 3.手动添加映射 4.其他用法   1.常用方法介绍         里面有一些常见的方法,如下: Worksheet 获得工作表中的数据 Works ...

  2. Unity3d工具方法小集

    1.获取垂直水平方向上的输入: float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = I ...

  3. Android OpenStreetMap(OSM) 使用 osmbonuspack 进行导航

    关于OpenStreetMap的介绍,国内还是很少,csdn上面有一篇,写的不错,我也就不再做重复的事情了. 这里贴出链接地址:http://blog.csdn.net/mad1989/article ...

  4. kafka常用命令笔记

    0.查看有哪些主题: ./kafka-topics.sh --list --zookeeper 192.168.0.201:12181 1.查看topic的详细信息 ./kafka-topics.sh ...

  5. Linux 远程主机安全配置

    开启了新的 Linux 服务器后,首要任务是做安全配置. 首先更新: # ubuntu sudo apt-get update # 获取 apt 源的软件列表 sudo apt-get upgrade ...

  6. Go基础篇【第1篇】: 内置库模块 OS

    os包提供了操作系统函数的不依赖平台的接口.设计为Unix风格的,虽然错误处理是go风格的:失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.os包的接口规定为在所有操作系统中都是一致的.非 ...

  7. NOIP 2009 靶形数独(DLX)

    小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作 ...

  8. tomcat中配置JNDI方法

    1.项目中spring的数据源配置: <bean id="dataSource" class="org.springframework.jndi.JndiObjec ...

  9. c++单例模式代码分析

    单例模式就是一个C++语法精华浓缩的一个体现,有句老话:麻雀虽小五脏俱全!来形容单例非常贴切! 下面的代码分析了如果自己malloc并且memcpy一个单例指针会带来很大危害并如何防止这种情况发生. ...

  10. weak_ptr打破环状引用

    转自:http://blog.csdn.net/malong777/article/details/48974559 weak_ptr是一种不控制对象生存周期的智能指针,它指向一个shared_ptr ...