51nod 1286 三段子串(树状数组+拓展kmp)
题意:
给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合。求T最长的长度。
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int maxn = 1e6 + ;
char S[maxn];
int Next[maxn], extend[maxn];
vector<int> G[maxn];
int len;
int c[maxn*];
void Modify(int x, int s){
for(; x <= len; x += x&(-x)) c[x] += s;
}
int Query(int y){
if(y <= ) return ;
int ans = ;
for(int x = y; x; x -= x&(-x)) ans += c[x];
return ans;
}
int query(int x, int y) { return x <= y ? Query(y) - Query(x-) : ; }
void GetNext(char *T, int *Next){
int len = strlen(T);
Next[] = len;
int a, p;
for(int i = , j = -; i < len; i++, j--){
if(j < || i + Next[i-a] >= p){
if(j < ) p = i, j = ;
while(p < len && T[p] == T[j])
p++, j++;
Next[i] = j;
a = i;
} else Next[i] = Next[i-a];
}
}
void GetExtend(char *S, char *T, int *extend, int *Next){
GetNext(T, Next);
int a, p;
int slen = strlen(S), tlen = strlen(T);
for(int i = , j = -; i < slen; i++, j--){
if(j < || i + Next[i-a] >= p){
if(j < ) p = i, j = ;
while(p < slen && j < tlen && S[p] == T[j]) p++, j++;
extend[i] = j;
a = i;
} else extend[i] = Next[i-a];
}
} int main()
{
cin>>S;
len = strlen(S);
GetNext(S, Next);
//for(int i = 0; i < len; i++) cout<<Next[i]<<" "; cout<<endl;
for(int i = ; i < len; i++) G[Next[i]].push_back(i);
int ans = ;
for(int i = len-; i >= ; i--){
for(auto x : G[i]) Modify(x+, );
int n = G[i].size();
if(n == ) continue;
if(G[i][n-] != len-i) continue;
if(query(i+, len-*i+)) { ans = i; break; }
}
cout<<ans<<endl;
return ;
}
51nod 1286 三段子串(树状数组+拓展kmp)的更多相关文章
- 51Nod 1680 区间求和 树状数组
题意: 给出一个长度为\(n\)的数列\(A_i\),定义\(f(k)\)为所有长度大于等于\(k\)的子区间中前\(k\)大数之和的和. 求\(\sum_{k=1}^{n}f(k) \; mod \ ...
- 51Nod 1272最大距离 (树状数组维护前缀最小值)
题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...
- 51nod 1681 公共祖先 | 树状数组
51nod 1681 公共祖先 有一个庞大的家族,共n人.已知这n个人的祖辈关系正好形成树形结构(即父亲向儿子连边). 在另一个未知的平行宇宙,这n人的祖辈关系仍然是树形结构,但他们相互之间的关系却完 ...
- 51nod 1290 Counting Diff Pairs | 莫队 树状数组
51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...
- ACM学习历程—51NOD 1685 第K大区间2(二分 && 树状数组 && 中位数)
http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...
- BZOJ 1396:识别子串 SA+树状数组+单调队列
1396: 识别子串 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 381 Solved: 243[Submit][Status][Discuss] ...
- 51nod 1081 子段求和(线段树 | 树状数组 | 前缀和)
题目链接:子段求和 题意:n个数字序列,m次询问,每次询问从第p个开始L长度序列的子段和为多少. 题解:线段树区间求和 | 树状数组区间求和 线段树: #include <cstdio> ...
- 51nod 1680区间求和 (dp+树状数组/线段树)
不妨考虑已知一个区间[l,r]的k=1.k=2....k=r-l+1这些数的答案ans(只是这一个区间,不包含子区间) 那么如果加入一个新的数字a[i](i = r+1) 则新区间[l, i]的答案为 ...
- 51nod 麦克打电话(AC自动机+树状数组)
SAM+线段树合并的裸题. 但我们讨论AC自动机的做法. 先建出AC自动机.考虑询问在[a,b]中出现的次数就是\([1,b]\)的出现次数-\([1,a-1]\)的出现次数.把询问离线.然后我们要求 ...
随机推荐
- 全国Uber优步司机奖励政策 (12月28日-1月3日)
本周已经公开奖励整的城市有:北 京.成 都.重 庆.上 海.深 圳.长 沙.佛 山.广 州.苏 州.杭 州.南 京.宁 波.青 岛.天 津.西 安.武 汉.厦 门,可按CTRL+F,搜城市名快速查找. ...
- 北京Uber优步司机奖励政策(11月9日~11月15日)
用户组:人民优步“关羽组”(适用于11月9日-11月15日)奖励政策: 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月 ...
- DSP28335的上手试用LED灯闪烁-第一篇
1. 本次以三兄弟的DSP28335开发板为例,看下JTAG接口,EMU0,EMU1的用途,不是很懂,不深入研究,用到再说 EMU0/1是TI芯片的JTAG才有的信号,本身不属于JTAG标准里的信号, ...
- python 函数定义顺序
#!/usr/bin/python # Hello World def order(): print("haha") print('Hello World!') order()
- 使用Python访问HDFS
最近接触到大数据,对于Skpark和Hadoop的料及都停留在第一次听到这个名词时去搜一把看看大概介绍免得跟不上时代的层次. 在实际读了点别人的代码,又自己写了一些之后,虽然谈不上理解加深,至少对于大 ...
- Qt listwigwt item 加入自定义元素
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- katalon系列七:Katalon Studio全局变量
假如你有3个脚本都用到了用户名,如果是写死在脚本中,那么需要改变的时候,你需要修改3个地方,我们可以把用户名设为全局变量,在3个脚本中引用,需要修改时只要修改全局变量中的用户名值即可. 在Katalo ...
- Unity编辑器 - 自动排版
Unity编辑器 - 自动排版 使用花括号提高可读性 //一组横向排列的控件 GUILayout.BeginHorizontal(); { GUILayout.BeginVertical(); { / ...
- Java学习 · 初识 容器和数据结构
容器和数据结构 1. 集合的引入 a) 集合的使用场景:需要将一些相同结构的个体整合到一起时 i. 新闻列表 ii. 邮件列表 iii. ...
- POJ 2208 Pyramids(求四面体体积)
Description Recently in Farland, a country in Asia, a famous scientist Mr. Log Archeo has discovered ...