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的大小可以拓扑排序求出 ...
随机推荐
- html5-浮动
#div1{ background: rgba(255,0,0,0.5); width: 250px; height: 250px; float: right;}#div2{ ...
- 泛型List、HashTable
从最开始接触的数组,到非泛型集合类(ArrayList.HashTable.Queue.Stack).泛型集合类(List<T>.Dictionary<T>.Queue< ...
- C/C++笔试题(编程题)
面试过程中遇到的编程题整理,于此备录.分享,共勉.(持续更新中......欢迎补充) (1)用户输入M, N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出.写出C程序. 程序代码如下: ...
- HashMap的底层实现原理
HashMap的底层实现原理1,属性static final int MAX_CAPACITY = 1 << 30;//1073741824(十进制)0100000000000000000 ...
- 如何用新安装的jdk替换掉Linux系统默认jdk
版主写的非常棒: http://blog.csdn.net/u011364306/article/details/48375653
- hive 实现一个字段多行转一行 和 一行转多行
1.多行转一行 多行转一行可以通过concat_ws(',',collect_set(col_name)) as col_new的方式实现,可以参考:https://www.cnblogs.com/s ...
- 开发vue单页面Demo
第1步:安装webpack脚手架 npm install webpack -g (全局安装) (新电脑启动npm run dev版本报错,是因为webpack-server版本更新的问题,要安装pac ...
- case when then的用法
用法一:等值判断,相当于switch CASE expression WHEN value1 THEN returnValue1 WHEN value2 THEN returnValue2 WHEN ...
- RESTful API 设计指南,RESTful API 设计最佳实践
RESTful API 设计指南,RESTful API 设计最佳实践 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备......). ...
- GUI常用对话框4
%普通对话框 dialog %单击时会关闭当前窗口 %自定义 关于对话框 点击确定 关闭 h = dialog( ]); uicontrol( ], ... 'string','确定','Callba ...