POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)
后缀数组:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- #include<vector>
- using namespace std;
- typedef long long ll;
- const int N=2e5+,mod=;
- char s[N];
- int sa[N],buf1[N],buf2[N],c[N],n,n1,n2,rnk[N],ht[N],ST[N][],Log[N];
- void Sort(int* x,int* y,int m) {
- for(int i=; i<m; ++i)c[i]=;
- for(int i=; i<n; ++i)++c[x[i]];
- for(int i=; i<m; ++i)c[i]+=c[i-];
- for(int i=n-; i>=; --i)sa[--c[x[y[i]]]]=y[i];
- }
- void da(char* s,int n,int m=) {
- int *x=buf1,*y=buf2;
- x[n]=y[n]=-;
- for(int i=; i<n; ++i)x[i]=s[i],y[i]=i;
- Sort(x,y,m);
- for(int k=; k<n; k<<=) {
- int p=;
- for(int i=n-k; i<n; ++i)y[p++]=i;
- for(int i=; i<n; ++i)if(sa[i]>=k)y[p++]=sa[i]-k;
- Sort(x,y,m),p=,y[sa[]]=;
- for(int i=; i<n; ++i)y[sa[i]]=x[sa[i-]]==x[sa[i]]&&x[sa[i-]+k]==x[sa[i]+k]?p-:p++;
- if(p==n)break;
- swap(x,y),m=p;
- }
- }
- void getht() {
- for(int i=; i<n; ++i)rnk[sa[i]]=i;
- ht[]=;
- for(int i=,k=; i<n; ++i) {
- if(k)--k;
- if(!rnk[i])continue;
- for(; s[i+k]==s[sa[rnk[i]-]+k]; ++k);
- ht[rnk[i]]=k;
- }
- }
- void initST() {
- for(int i=; i<n; ++i)ST[i][]=ht[i];
- for(int j=; (<<j)<=n; ++j)
- for(int i=; i+(<<j)-<n; ++i)
- ST[i][j]=min(ST[i][j-],ST[i+(<<(j-))][j-]);
- }
- int lcp(int l,int r) {
- if(l==r)return n-sa[l];
- if(l>r)swap(l,r);
- l++;
- int k=Log[r-l+];
- return min(ST[l][k],ST[r-(<<k)+][k]);
- }
- int main() {
- Log[]=-;
- for(int i=; i<N; ++i)Log[i]=Log[i>>]+;
- scanf("%s",s),n1=strlen(s),s[n1]='|',scanf("%s",s+n1+),n=strlen(s);
- da(s,n),getht(),initST();
- vector<int> v1,v2;
- for(int i=; i<n1; ++i)v1.push_back(rnk[i]);
- for(int i=n1+; i<n; ++i)v2.push_back(rnk[i]);
- sort(v1.begin(),v1.end());
- sort(v2.begin(),v2.end());
- int ans=;
- for(int i=,j=; i<v1.size(); ++i) {
- for(; j<v2.size()&&v2[j]<v1[i]; ++j);
- if(j->=)ans=max(ans,lcp(v1[i],v2[j-]));
- if(j<v2.size())ans=max(ans,lcp(v1[i],v2[j]));
- }
- printf("%d\n",ans);
- return ;
- }
后缀自动机:
- #include<cstdio>
- #include<algorithm>
- #include<cstring>
- using namespace std;
- typedef long long ll;
- const int N=2e5+,M=,mod=;
- char s[N];
- int n,fa[N],go[N][M],mxl[N],last,tot;
- int newnode(int l) {int u=++tot; mxl[u]=l,memset(go[u],,sizeof go[u]); return u;}
- void add(int ch) {
- int p=last,np=last=newnode(mxl[p]+);
- for(; ~p&&!go[p][ch]; p=fa[p])go[p][ch]=np;
- if(!~p)fa[np]=;
- else {
- int q=go[p][ch];
- if(mxl[q]==mxl[p]+)fa[np]=q;
- else {
- int nq=newnode(mxl[p]+);
- memcpy(go[nq],go[q],sizeof go[q]);
- fa[nq]=fa[q],fa[q]=fa[np]=nq;
- for(; ~p&&go[p][ch]==q; p=fa[p])go[p][ch]=nq;
- }
- }
- }
- int main() {
- fa[]=-;
- scanf("%s",s),n=strlen(s);
- for(int i=; i<n; ++i)add(s[i]-'a');
- scanf("%s",s),n=strlen(s);
- int ans=;
- for(int i=,u=,l=; i<n; ++i) {
- int ch=s[i]-'a';
- if(!go[u][ch]) {
- for(; u&&!go[u][ch]; u=fa[u]);
- l=mxl[u];
- }
- if(go[u][ch])u=go[u][ch],++l;
- ans=max(ans,l);
- }
- printf("%d\n",ans);
- return ;
- }
POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)的更多相关文章
- (17/34)AC自动机/后缀数组/后缀自动机(施工中)
快补题别再摸鱼了(17/34) 1.AC自动机 #define maxnode 1000010 #define maxsize 26 struct ahocT{ int ch[maxnode][max ...
- 字符串的模板 Manacher kmp ac自动机 后缀数组 后缀自动机
为何scanf("%s", str)不需要&运算 经常忘掉的字符串知识点,最好不加&,不加&最标准,指针如果像scanf里一样加&是错的,大概是未定 ...
- 【整理】如何选取后缀数组&&后缀自动机
后缀家族已知成员 后缀树 后缀数组 后缀自动机 后缀仙人掌 后缀预言 后缀Splay ? 后缀树是后缀数 ...
- loj6173 Samjia和矩阵(后缀数组/后缀自动机)
题目: https://loj.ac/problem/6173 分析: 考虑枚举宽度w,然后把宽度压位集中,将它们哈希 (这是w=2的时候) 然后可以写一下string=“ac#bc” 然后就是求这个 ...
- 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 A.串串-后缀自动机模板题
链接:https://ac.nowcoder.com/acm/contest/558/A来源:牛客网 A.串串 小猫在研究字符串. 小猫在研究字串. 给定一个长度为N的字符串S,问所有它的子串Sl…r ...
- POJ 2774 Long Long Message 后缀数组
Long Long Message Description The little cat is majoring in physics in the capital of Byterland. A ...
- poj 2774 Long Long Message 后缀数组基础题
Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 24756 Accepted: 10130 Case Time Limi ...
- 后缀数组(模板题) - 求最长公共子串 - poj 2774 Long Long Message
Language: Default Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 21 ...
- [POJ 2774] Long Long Message 【后缀数组】
题目链接:POJ - 2774 题目分析 题目要求求出两个字符串的最长公共子串,使用后缀数组求解会十分容易. 将两个字符串用特殊字符隔开再连接到一起,求出后缀数组. 可以看出,最长公共子串就是两个字符 ...
- POJ 2774 Long Long Message(后缀数组)
[题目链接] http://poj.org/problem?id=2774 [题目大意] 求最长公共子串 [题解] 将两个串中间嵌一个字符相连,求一遍后缀数组 如果排名相邻的两个后缀的开端是分属于两个 ...
随机推荐
- 已经配置好了的 jmeter + ant 框架
已经配置好了的 jmeter + ant 框架 ,需要自取,避免查找安装攻略时耗费时间 使用前需配置环境变量,阅读文件内安装文档!!! 链接:https://pan.baidu.com/s/1eRz9 ...
- webdriervAPI(窗口截图)
from selenium import webdriver driver = webdriver.Chorme() driver.get("http://www.baidu.co ...
- python+selenium显示等待、隐式等待和强制等待的区别
在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(a ...
- [转帖]处理器结构--PipeLine&SuperScalar
处理器结构--PipeLine&SuperScalar https://www.jianshu.com/p/36c80a15a226 0.1 2018.06.12 16:12* 字数 148 ...
- mysql一个SQL案例
需求 : 测试数据 ),start1 int,end1 int); ,); ,); ,); ,); ,); ,); 解决: 解决2: 解决代码 核心思想,把符合逻辑条件的行,构造相同分组 select ...
- c++ split(getline实现)
众所周知 c++中string没有自带的split函数(亏你还是老大哥) 网上关于split函数的优秀写法很多 本人不再赘述 今几日翻C++API时发现了getline一个有趣的方法 istream& ...
- 2019年8月23日 星期五(Workerman)
Workerman,高性能socket服务框架 Workerman是什么? Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架. Workerman不是重复造轮子,它不是 ...
- sklearn-GDBT
GDBT 可以解决分类和回归问题 回归问题 def __init__(self, loss='ls', learning_rate=0.1, n_estimators=100, subsample=1 ...
- python-socketserver实例
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while Tru ...
- 程序员必备的网站之Tutorialspoint
程序员必备的网站之Tutorialspoint 给大家介绍一个非常好的网站Tutorialspointhttp://www.tutorialspoint.com/index.htm,也许好多人都已经用 ...