贸易公司网站制作,做心理咨询可以在哪些网站发贴,wordpress 数据库替换,写wordpress导航正题
题目链接:https://www.luogu.com.cn/problem/P5287 题目大意
开始一个空串#xff0c;nnn个操作
在末尾加入xxx个ccc字符#xff08;保证和ccc和前面的字符不同#xff09;返回到第xxx次操作之后
每次操作完成后求所有前缀的最长的borderborderborder长度和 1≤n≤…正题
题目链接:https://www.luogu.com.cn/problem/P5287 题目大意
开始一个空串nnn个操作
在末尾加入xxx个ccc字符保证和ccc和前面的字符不同返回到第xxx次操作之后
每次操作完成后求所有前缀的最长的borderborderborder长度和
1≤n≤1051\leq n\leq 10^51≤n≤105 解题思路
二操作好像是一个离线树能搞出来的先只考虑一操作因为是相当于求kmpkmpkmp之后的nextnextnext和所以可以考虑一下用kmpkmpkmp。
每个插入操作我们可以看做插入了一个二元组(c,x)(c,x)(c,x)nxtinxt_inxti表示按照二元组完全匹配来KMP的nextnextnext数组。
然后求答案的时候设现在这个二元组(c,x)(c,x)(c,x)已经匹配到nownownow个ccc然后往前跳nxtnxtnxt的时候如果下一个二元组的字符是ccc且数量xnowxnowxnow那么我们就往后计算答案然后让nowxnowxnowx。
然后最后剩下的一些如果能和第一个匹配就全都匹配。
然后这样跑是能过的但是加了二操作之后就会TTT因为KMP是均摊复杂度的会被hackhackhack。
所以考虑一下怎么优化我们知道broderbroderbroder可以被划分成logloglog个等差数列而且一定是按照长度来排列的如果我们发现我们跳进了一个无法匹配的等差数列中我们就直接跳到这个等差数列结束的位置因为这个等差数列中已经不能匹配了。
这样复杂度就到了O(nlogn)O(n\log n)O(nlogn)了 code
#includecstdio
#includecstring
#includealgorithm
#includecmath
#includevector
#define ll long long
using namespace std;
const ll N1e510,P998244353;
ll n,len,ch[N][2],s[N][3],ans[N],nxt[N],prt[N],p[N];
vectorll e[N];
ll gs(ll l,ll r)
{return (rl)*(r-l1)/2;}
void dfs(ll x){ll inxt[len];s[len][0]ch[x][0];s[len][1]ch[x][1];s[len][2]s[len-1][2]ch[x][1];ans[len]ans[len-1];nxt[len]0;if(len1){ans[len]gs(1,ch[x][1]-1);}else{ll dlen-i;while(i(s[i1][0]!ch[x][0]||s[i1][1]!ch[x][1])){if(i-nxt[i]d)ii%dd;di-nxt[i];inxt[i];}nxt[len]i(i||(ch[x][0]s[1][0]ch[x][1]s[1][1]));ll now0;inxt[len-1],dlen-1-i;while(nowch[x][1]i){if(s[i1][0]ch[x][0]s[i1][1]now){ans[len]gs(s[i][2]now1,s[i][2]min(ch[x][1],s[i1][1]));nows[i1][1];}if(i-nxt[i]d)ii%dd;di-nxt[i];inxt[i];}if(nowch[x][1]s[1][0]ch[x][0]){if(s[i1][1]now)ans[len]gs(now1,min(ch[x][1],s[i1][1]));nowmax(now,min(ch[x][1],s[i1][1]));ans[len]s[1][1]*(ch[x][1]-now);}}prt[x]ans[len];for(ll i0;ie[x].size();i)dfs(e[x][i]);len--;return;
}
signed main()
{scanf(%lld,n);for(ll i1;in;i){ll op;scanf(%lld ,op);if(op1){scanf(%lld %c,ch[i][1],ch[i][0]);e[p[i-1]].push_back(p[i]i);}else{ll x;scanf(%lld,x);p[i]p[x];}}for(ll i0;ie[0].size();i)dfs(e[0][i]);for(ll i1;in;i)printf(%lld\n,prt[p[i]]%P);return 0;
}