题意:

给定一个字符串S,找到另外一个字符串T,T既是S的前缀,也是S的后缀,并且在中间某个地方也出现一次,并且这三次出现不重合。求T最长的长度。

例如:S = "abababababa",其中"aba"既是S的前缀,也是S的后缀,中间还出现了一次,并且同前缀后缀均不重合。所以输出"aba"的长度3。如果找不到一个符合条件的字符,输出0。
 
题解:
先对S做一次拓展kmp,求出next数组
然后其实next每一个数就对应了一个前缀匹配的情况。
比如说next[3]和next[5]都为2,就意味着前缀为2的子串可以和位置为3和位置为5的子串匹配。
然后我们按照next数组倒序来做。
对于长度为i的前缀,先判断是否存在长度为i的后缀匹配,如果存在再询问是否存在中间子串。
每次匹配的结果都插入到树状数组里面(因为如果某个位置可以匹配L的前缀,那么实际上1~L-1都能匹配)
然后询问i+1 ~ L-2i+1这个区间里有没有能匹配的子串(即中间的那个串)。
 
#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 ;
}

最新文章

  1. 【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
  2. 使用idea创建maven的web项目
  3. 详解Android ActionBar之二:ActionBar添加Tabs标签和下拉导航
  4. EBS系统启动&amp;停止&amp;增加表空间&amp;替换首页图片
  5. Linux常用命令和常见问题解决&lt;------&gt;第一章
  6. bzoj1597[Usaco2008 Mar]土地购买 斜率优化dp
  7. C# 计算地图上某个坐标点的到多边形各边的距离
  8. 本文之后都以Vol1来指代
  9. 高性能JavaScript读后感
  10. 《JAVA与模式》之代理模式
  11. e662. 取的图像的色彩模型
  12. Qt的安装和使用中的常见问题(简略版)
  13. pandans导出Excel并将数据保存到不同的Sheet表中
  14. [linx] ubuntu网络重启命令
  15. 006 Java并发编程wait、notify、notifyAll和Condition
  16. 109th LeetCode Weekly Contest Number of Recent Calls
  17. js中判断对象是否存在
  18. Servlet3.0: 简介AsyncContext
  19. CyclicBarrier和CountDownLatch的使用
  20. python 爬取腾讯视频评论

热门文章

  1. 创龙DSP6748开发板上电测试-第一篇
  2. 白话控制反转IoC及其应用
  3. TraceHelper
  4. How To Install Apache Tomcat 7 on CentOS 7 via Yum
  5. package.json中的devDependencies和dependencies有啥区别?
  6. hdu1175连连看(dfs+细节)
  7. 前端开发工程师 - 02.JavaScript程序设计 - 第2章.进阶篇
  8. Spark- 根据IP获取城市(java)
  9. NOIP2012 普及组真题 4.13校模拟
  10. Python3 Tkinter-Place