尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CF710F String Set Queries 题解

CF710F String Set Queries 题解 CF710F String Set Queries题目描述你需要对一个字符串集合D DD处理m mm个查询。每个查询有三种类型之一向集合D DD中添加一个字符串s ss。保证字符串s ss之前没有被添加过。从集合D DD中删除一个字符串s ss。保证字符串s ss当前在集合D DD中。给定字符串s ss求集合D DD中所有字符串在s ss中出现的次数总和。如果集合D DD中的某个字符串p pp在s ss中出现了多次则应计入所有出现次数。请注意你需要以在线模式online解决此问题。这意味着你不能一次读取所有输入。你只能在输出上一个三类查询的答案后读取下一个查询。在你的程序中你需要在每次输出后调用 C 的 fflush 或 Java 的 BufferedWriter.flush 函数。输入格式第一行包含一个整数m mm1 ≤ m ≤ 3 ⋅ 10 5 1 \leq m \leq 3 \cdot 10^{5}1≤m≤3⋅105表示查询的数量。接下来的m mm行每行包含一个整数t tt1 ≤ t ≤ 3 1\leq t \leq 31≤t≤3和一个非空字符串s ss表示查询的类型以及需要处理的字符串。所有字符串仅包含小写英文字母。输入中所有字符串总长度不超过3 ⋅ 10 5 3 \cdot 10^{5}3⋅105。输出格式对于每个三类查询输出一个整数c cc表示集合D DD中所有字符串在s ss中出现的次数之和。输入输出样例 #1输入 #15 1 abc 3 abcabc 2 abc 1 aba 3 abababc输出 #12 2输入输出样例 #2输入 #210 1 abc 1 bcd 1 abcd 3 abcd 2 abcd 3 abcd 2 bcd 3 abcd 2 abc 3 abcd输出 #23 2 1 0说明/提示由 ChatGPT 5 翻译思路分块即可。代码#includebits/stdc.husingnamespacestd;constlonglongmod1e933,mod21000099721;constlonglongwc131,wc2133;longlongm,t,op10,op20,p1[300005],p2[300005],oj0,wu[300005],wd[300005],wd20,wds[300005],wds20,os1[300005],os2[300005],md0,op0;string s;mappairlonglong,longlong,longlongmp;intmain(){p1[0]1;for(inti1;i300000;i){p1[i]p1[i-1]*wc%mod;}p2[0]1;for(inti1;i300000;i){p2[i]p2[i-1]*wc2%mod2;}mdsqrt(300000);cinm;for(inti1;im;i){cints;if(t1){op10;for(intj0;js.size()-1;j){op1(op1*wc(longlong)s[j])%mod;}op20;for(intj0;js.size()-1;j){op2(op2*wc2(longlong)s[j])%mod2;}mp[{op1,op2}];wd[s.size()];wu[s.size()];if(s.size()md1wu[s.size()]1){wds[wds2]s.size();}}elseif(t2){op10;for(intj0;js.size()-1;j){op1(op1*wc(longlong)s[j])%mod;}op20;for(intj0;js.size()-1;j){op2(op2*wc2(longlong)s[j])%mod2;}mp[{op1,op2}]--;wd[s.size()]--;}else{op0;op10;for(intj0;js.size()-1;j){op1(op1*wc(longlong)s[j])%mod;os1[j1]op1;}op20;for(intj0;js.size()-1;j){op2(op2*wc2(longlong)s[j])%mod2;os2[j1]op2;}for(intj1;jmdjs.size();j){if(wd[j]!0){for(intl1;lj-1s.size();l){opmp[{(os1[lj-1]-os1[l-1]*p1[j]%modmod)%mod,(os2[lj-1]-os2[l-1]*p2[j]%mod2mod2)%mod2}];}}}for(intj1;jwds2;j){if(wds[j]s.size()){for(intl1;lwds[j]-1s.size();l){opmp[{(os1[lwds[j]-1]-os1[l-1]*p1[wds[j]]%modmod)%mod,(os2[lwds[j]-1]-os2[l-1]*p2[wds[j]]%mod2mod2)%mod2}];}}}coutopendl;cout.flush();}}return0;//}
返回列表