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的大小可以拓扑排序求出 ...
随机推荐
- Marlin 溫度 sensor 校正
Marlin 溫度 sensor 校正 使用 Type-K 溫度計 將探針綑綁在加熱頭側面 開啟Marlin-Marlin_v1\Marlin\thermistortables.h 要修改的溫度對應表 ...
- html5-table布局
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- Spark学习之路 (六)Spark Transformation和Action
Transformation算子 基本的初始化 java static SparkConf conf = null; static JavaSparkContext sc = null; static ...
- 【Linux学习五】文本处理
环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 一.cut:显示切割的行数据f:选择显示的列s:不显示没有分隔符的行d ...
- QTCreator 调试:unknown debugger type "No engine"
[1]QTCreator调试,应用程序输出:unknown debugger type "No engine" 如图:下断点->调试程序->应用程序输出 说明:调试器无 ...
- sql server 中后缀为.mdf的文件是干什么用的??
在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...
- 使用AJAX技术发送异步请求,HTTP服务端推送
使用AJAX技术发送异步请求 什么是AJAX AJAX指一步Javascript和XML(Asynchronous JavaScript And XML),它是一些列技术的组合,简单来说AJAX基于X ...
- 以太坊ETH中智能合约消耗的Gas、Gas Limit是什么?
以太坊ETH中智能合约消耗的Gas.Gas Limit是什么? 数字货币交易一般是有交易费的,比特币(BTC)的交易费很容易理解,就是直接支付一定额度的BTC作为手续费.而以太坊(ETH)的交易费表面 ...
- 1分钟完美安装最新CentOS+Nginx+PHP-FPM+MySQL
PHP 5.3.1 MySQL 5.0.89 Nginx 0.8.33 或 0.7.65 (可选) 现在,我们可以快速全自动搞定 CentOS + Nginx + PHP-FPM + MySQL 的安 ...
- Python基本数据类型——字典
字典 dict 字典是Python的另一种有序的可变数据结构,且可存储任意类型对象. 字典是一种键值对的数据容器,每个键值(key:value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典 ...