vue手机网站开发,网站建设人员的工资分配,内容营销是一种什么模式,如何制作完整网页正题
题目链接:https://www.luogu.com.cn/problem/P6640 题目大意
给出两个字符串s,ts,ts,t。qqq次给出l,rl,rl,r询问sl∼rs_{l\sim r}sl∼r与ttt的最长公共子串。 解题思路
对于末尾的条件很好做#xff0c;直接上SAMSAMSAM就好了#xff0c;设fif_ifi表示一个最大的…正题
题目链接:https://www.luogu.com.cn/problem/P6640 题目大意
给出两个字符串s,ts,ts,t。qqq次给出l,rl,rl,r询问sl∼rs_{l\sim r}sl∼r与ttt的最长公共子串。 解题思路
对于末尾的条件很好做直接上SAMSAMSAM就好了设fif_ifi表示一个最大的数满足si−fi1,is_{i-f_i1,i}si−fi1,i是ttt的子串。
然后对于一个询问l,rl,rl,r就是相当于求max{min{fli−1,i}}(i∈[1,r−l1])max\{\ min\{f_{li-1},i\}\ \}(i\in[1,r-l1])max{ min{fli−1,i} }(i∈[1,r−l1])这个东西。
考虑二分一个答案xxx那么在[l,lx−2][l,lx-2][l,lx−2]这个范围内一定不会有答案在剩下的[lx−1,r][lx-1,r][lx−1,r]内取一个最大值和xxx做一下对比即可去掉minminmin的条件。
用一个STSTST维护一下就好了时间复杂度O(nqlogn)O(nq\log n)O(nqlogn) code
#includecstdio
#includecstring
#includealgorithm
using namespace std;
const int N4e510,T19;
int n,m,q,last,cnt,lg[N],f[N][T];
int ch[N][26],len[N],fa[N];
char s[N],t[N];
void Insert(int c){int plast,nplastcnt;len[np]len[p]1;for(;p!ch[p][c];pfa[p])ch[p][c]np;if(!p)fa[np]1;else{int qch[p][c];if(len[p]1len[q])fa[np]q;else{int nqcnt;len[nq]len[p]1;memcpy(ch[nq],ch[q],sizeof(ch[nq]));fa[nq]fa[q];fa[q]fa[np]nq;for(;pch[p][c]q;pfa[p])ch[p][c]nq;}}return;
}
int Ask(int l,int r){int zlg[r-l1];return max(f[l][z],f[r-(1z)1][z]);
}
int main()
{scanf(%s,t1);mstrlen(t1);scanf(%s,s1);nstrlen(s1);scanf(%d,q);lastcnt1;for(int i1;in;i)Insert(s[i]-a);for(int i1,p1,l0;im;i){int ct[i]-a;while(!ch[p][c])pfa[p],llen[p];if(!p)p1,l0;else pch[p][c],l;f[i][0]l;}for(int i2;in;i)lg[i]lg[i1]1;for(int j1;(1j)n;j)for(int i1;i(1j)-1n;i)f[i][j]max(f[i][j-1],f[i(1j-1)][j-1]);while(q--){int L,R;scanf(%d%d,L,R);int l1,rR-L1;while(lr){int mid(lr)1;if(Ask(Lmid-1,R)mid)lmid1;else rmid-1;}printf(%d\n,r);}return 0;
}