大前端最新网站,2008iis添加网站打不开,宁波seo企业推广,网站排名优化快速正题
题目链接:https://www.luogu.com.cn/problem/P5341 题目大意
给出一个字符串#xff0c;求出现次数恰好为kkk的子串中#xff0c;出现最多的长度。 解题思路
先根据TTT构建一个SAMSAMSAM#xff0c;对于一个endposendposendpos类中#xff0c;所有出现串的长度一定…正题
题目链接:https://www.luogu.com.cn/problem/P5341 题目大意
给出一个字符串求出现次数恰好为kkk的子串中出现最多的长度。 解题思路
先根据TTT构建一个SAMSAMSAM对于一个endposendposendpos类中所有出现串的长度一定是一个连续的区间。 所以我们直接计算出每个endposendposendpos类的大小如果是kkk就差分让[lenfx1,lenx][len_{f_x}1,len_{x}][lenfx1,lenx]加111。
时间复杂度O(n)O(n)O(n) codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N2e510;
ll T,n,k,a[N],c[N],rk[N],num[N];
ll cnt,last,fa[N],ch[N][26],len[N];
char s[N];
void insert(ll c){ll plast,nplastcnt;len[np]len[p]1;num[cnt];for(;p!ch[p][c];pfa[p])ch[p][c]np;if(!p)fa[np]1; else{ll qch[p][c];if(len[p]1len[q])fa[np]q;else{ll 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 main()
{scanf(%lld,T);while(T--){lastcnt1;memset(ch[1],0,sizeof(ch[1]));scanf(%s,s1);nstrlen(s1);for(ll i1;in;i)insert(s[i]-a),a[i]c[i]0;scanf(%lld,k);bool flag0;for(ll i1;icnt;i)c[len[i]];for(ll i1;in;i)c[i]c[i-1];for(ll i1;icnt;i)rk[c[len[i]]--]i;for(ll icnt;i1;i--)num[fa[rk[i]]]num[rk[i]];for(ll i2;icnt;i)if(num[i]k)a[len[i]],a[len[fa[i]]]--,flag1;for(ll in;i0;i--)a[i]a[i1];ll mark0;a[0]0;for(ll i1;in;i)if(a[i]a[mark])marki;if(!flag)printf(-1\n);else printf(%lld\n,mark);for(ll i0;icnt;i)num[i]fa[i]len[i]0,memset(ch[i],0,sizeof(ch[i]));}
}