HIHOcoder 1441 后缀自动机一·基本概念
思路
SAM的概念题
暴力模拟就好了
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
set<int> St[2511];
const int base = 131;
int setcnt=0,minlens[2511],minlent[2511],maxlens[2511],maxlent[2511],n,lens,lent;
char s[2511],t[2511];
unsigned long long hashs[120],powh[120];
void init(void){
for(int i=1;i<=2510;i++){
minlent[i]=0x3f3f3f3f;
maxlens[i]=1;
}
powh[0]=1;
for(int i=1;i<=100;i++)
powh[i]=powh[i-1]*base;
}
unsigned long long hashf(int l,int r){
return hashs[r]-hashs[l-1]*powh[r-l+1];
}
int main(){
init();
scanf("%s",s+1);
lens=strlen(s+1);
for(int i=1;i<=lens;i++){
hashs[i]=hashs[i-1]*base+s[i];
}
for(int l=1;l<=lens;l++)
for(int r=l;r<=lens;r++){
set<int> S;
while(S.size())
S.erase(S.begin());
for(int i=1;i<=lens-(r-l+1)+1;i++)
if(hashf(i,i+(r-l+1)-1)==hashf(l,r))
S.insert(i+(r-l+1)-1);
bool f=false;
// for(int k=l;k<=r;k++)
// putchar(s[k]);
// putchar('\n');
// for(set<int>::iterator it=S.begin();it!=S.end();it++)
// printf("%d ",(*it));
// printf("\n");
for(int i=1;i<=setcnt;i++){
if(S==St[i]){
// printf("into %d\n",i);
f=true;
if(minlent[i]-minlens[i]+1>r-l+1){
minlent[i]=r;
minlens[i]=l;
}
if(maxlent[i]-maxlens[i]+1<r-l+1){
maxlent[i]=r;
maxlens[i]=l;
}
break;
}
}
if(!f){
// printf("New\n");
++setcnt;
St[setcnt]=S;
minlens[setcnt]=maxlens[setcnt]=l;
minlent[setcnt]=maxlent[setcnt]=r;
}
}
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%s",t+1);
lent=strlen(t+1);
unsigned long long hashval=0;
set<int> S;
while(S.size())
S.erase(S.begin());
for(int j=1;j<=lent;j++)
hashval=hashval*base+t[j];
// printf("hasf=%lld %lld\n",hashf(2,5),hashval);
for(int j=1;j<=lens-lent+1;j++)
if(hashf(j,j+lent-1)==hashval)
S.insert(j+lent-1);
// for(set<int>::iterator it=S.begin();it!=S.end();it++)
// printf("%d ",(*it));
// printf("\n");
for(int j=1;j<=setcnt;j++){
if(S==St[j]){
for(int k=minlens[j];k<=minlent[j];k++)
putchar(s[k]);
putchar(' ');
for(int k=maxlens[j];k<=maxlent[j];k++)
putchar(s[k]);
putchar(' ');
for(set<int>::iterator it = S.begin();it!=S.end();it++)
printf("%d ",(*it));
printf("\n");
break;
}
}
}
return 0;
}
HIHOcoder 1441 后缀自动机一·基本概念的更多相关文章
- 【后缀自动机】hihocoder1441 后缀自动机一·基本概念
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi:今天我们来学习一个强大的字符串处理工具:后缀自动机(Suffix Automaton,简称SAM).对于一个字符串 ...
- hihoCoder #1465 : 后缀自动机五·重复旋律8
http://hihocoder.com/problemset/problem/1465 求S的循环同构串在T中的出现次数 将串S变成SS 枚举SS的每个位置i,求出以i结尾的SS的子串 与 T的最长 ...
- hihoCoder #1445 : 后缀自动机二·重复旋律5
#1445 : 后缀自动机二·重复旋律5 时间限制:10000ms 单点时限:2000ms 内存限制:256MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一个音乐旋律被表示为一段数构成的数 ...
- HIHOcoder 1457 后缀自动机四·重复旋律7
思路 后缀自动机题目,题目本质上是要求求出所有不同的子串的和,SAM每个节点中存放的子串互不相同,所以对于每个节点的sum,可以发现是可以递推的,每个点对子节点贡献是sum[x]*10+c*sz[x] ...
- hihocoder 1457 后缀自动机四·重复旋律7 求不同子串的和
描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品 ...
- hihocoder 1457 后缀自动机四·重复旋律7 ( 多串连接处理技巧 )
题目链接 分析 : 这道题对于单个串的用 SAM 然后想想怎么维护就行了 但是多个串下.可以先将所有的串用一个不在字符集( 这道题的字符集是 '0' ~ '9' ) 链接起来.建立后缀自动机之后 在统 ...
- hihoCoder #1457 : 后缀自动机四·重复旋律7(后缀自动机 + 拓扑排序)
http://hihocoder.com/problemset/problem/1457 val[i] 表示状态i所表示的所有字符串的十进制之和 ans= ∑ val[i]在后缀自动机上,从起始状态走 ...
- HIHOcoder 1466 后缀自动机六·重复旋律9
思路 后缀数组+博弈论的好题,首先对两个串都建出SAM,然后题目的要求实际上就是在SAM的trans上转移即可 DAG的博弈是经典问题,然后dfs求出SG函数,两个游戏的组合就是把SG函数异或起来,异 ...
- HIHOcoder 1449 后缀自动机三·重复旋律6
思路 显然endpos的大小就对应了对应子串的出现次数,所以快速求出endpos的大小,然后用它更新对应子串长度(minlen[i]~maxlen[i])的答案即可 endpos的大小可以拓扑排序求出 ...
随机推荐
- MVC 下拉列表三级联动
当前所做的项目,关于数据库设计的时候有点小意思,表A是三个联合主键,key1,key2,key3,表B是四个联合主键 key1,key2,key3,key4,其中表B的联合外键关联表A对应的联合主键, ...
- 分布式系统ID生成方案
自增ID 不错,可以限度抑制ID的大小.但需要有一个中心化的节点作为解决原子性问题.可以选用Redis,MySQL,Zookeeper.成本有点高. UUID 分布式,而且唯一!缺点是生产的ID太长. ...
- mysql的sql执行计划详解
实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写 ...
- sql server启动服务和还原bak文件
sql server启动服务和还原bak文件, sql server启动要: mysql数据库备份是psc后缀文件, sql server还原数据库备份bak文件: 三张图简介明了: ok:
- php 网站301重定向设置代码实战案例
php 网站301重定向设置代码实战案例 301重定向就是页面永久性移走的意思,搜索引擎知道这个页面是301重定向的话,就会把旧的地址替换成重定向之后的地址. 302重定向就是页面暂时性转移,搜索引擎 ...
- JS实现input中输入数字,控制每四位加一个空格(银行卡号格式)
前言 今天来讲讲js中实现input中输入数字,控制每四位加一个空格的方法!这个主要是应用于我们在填写表单的时候,填写银行卡信息,要求我们输入的数字是四位一个空格!今天主要介绍两种方式来实现这个方法! ...
- 什么是 shell
shell 在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器).它类似于DOS下的command.com和后来的cmd.exe.它接收用户命令,然后调 ...
- 算法提高 11-1实现strcmp函数
问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数.函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2.若s1与s2相等返回 ...
- python shutil模块简单介绍
python shutil模块简单介绍 简介 shutil模块提供了大量的文件的高级操作.特别针对文件拷贝和删除,主要功能为目录和文件操作以及压缩操作. shutil 模块方法: copy(src, ...
- mycat基本概念及配置文件详解
在介绍mycat之前,首先来了解一下数据库切分. 对于海量数据处理,按照使用场景,主要分为两类:联机事务处理(OLTP)和联机分析处理(OLAP). 联机事务处理也称为面向交易的处理系统,其基本特征是 ...