HDU4622 Reincarnation

给出一个串,每次询问其一个子串有多少不同的子串

按每个后缀建立\(SAM\)不断往后加字符,然后记录答案,查询的时候直接用即可

//#pragma GCC optimize("O3")
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<bits/stdc++.h>
using namespace std;
function<void(void)> ____ = [](){ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);};
const int MAXN = 4444;
int res[MAXN][MAXN];
char s[MAXN];
struct SAM{
int len[MAXN],link[MAXN],ch[MAXN][26],ret,tot,last;
void init(){
memset(ch,0,sizeof(ch));
link[tot = last = 0] = -1;
ret = 0;
}
void extend(int c){
int np = ++tot, p = last;
len[np] = len[last] + 1;
while(p!=-1 and !ch[p][c]){
ch[p][c] = np;
p = link[p];
}
if(p==-1) link[np] = 0;
else{
int q = ch[p][c];
if(len[p]+1==len[q]) link[np] = q;
else{
int clone = ++tot;
len[clone] = len[p] + 1;
link[clone] = link[q];
ret += len[clone] - len[link[clone]];
memcpy(ch[clone],ch[q],sizeof(ch[q]));
ret -= len[q] - len[link[q]];
link[q] = link[np] = clone;
ret += len[q] - len[link[q]];
while(p!=-1 and ch[p][c]==q){
ch[p][c] = clone;
p = link[p];
}
}
}
last = np;
ret += len[np] - len[link[np]];
}
}sam;
void solve(){
cin >> s;
int n = strlen(s);
for(int i = 0; i < n; i++){
sam.init();
for(int j = i; j < n; j++){
sam.extend(s[j]-'a');
res[i][j] = sam.ret;
}
}
int q; cin >> q;
while(q--){
int l, r; cin >> l >> r;
cout << res[l-1][r-1] << endl;
}
}
int main(){
____();
int T;
for(cin >> T; T; T--) solve();
return 0;
}

最新文章

  1. android studio关联genymotion模拟器,未显示设备
  2. 查看cpu
  3. HashMap的面试总结(摘抄)
  4. [转载] TCP与UDP对比
  5. 用jstack工具分析java程序
  6. Hibernate逍遥游记-第6章 通过Hibernate操纵对象(select-before-update)
  7. Day15 HTML补充、初识JavaScript
  8. fragment 数据传递,传值,通信
  9. H5 + 开发App(分享功能)
  10. 第4章 令牌端点(Token Endpoint) - IdentityModel 中文文档(v1.0.0)
  11. windows 和linux 路径解析的区别
  12. 关于Airtest的使用探索
  13. Kibana简单使用教程
  14. 替换JDK 对eclipse的影响?
  15. 如何让linux的history命令显示时间记录
  16. Nginx调试入门
  17. CSS3效果:实现气泡效果
  18. mikrotik ros CVE-2019–3924 DUDE AGENT VULNERABILITY
  19. harbor仓库镜像的删除
  20. Borrowed Time

热门文章

  1. 剑指offer 面试题4:二维数组中的查找
  2. (数据科学学习手札103)Python+Dash快速web应用开发——页面布局篇
  3. CPNDet:粗暴地给CenterNet加入two-stage精调,更快更强 | ECCV 2020
  4. node爬虫 -- 网页图片
  5. 针对Linux系统主机,进入修复模式,解决开机报错问题
  6. Spring Validation 验证
  7. Linux TCP漏洞 CVE-2019-11477 CentOS7 修复方法
  8. postgres模糊匹配大杀器
  9. Android事件分发机制五:面试官你坐啊
  10. Centos 7.x系统下忘记用户登录密码,重置root密码的方法