题目链接https://qoj.ac/contest/1885/problem/9925?v1题目描述给你一个字符串s仅有L和R组成可以进行两个操作任意遍1 将L左边的字符删除。2 将R左边的字符删除。现在给你q个字符串对于每个字符串t是否可以由s字符串通过前两个操作任意遍得到可以输出YES否则输出NO。题解1 可以发现L…R可以变成LRL…L可以变成LLR…L可以变成RLR…R可以变成RR。2 因此我们考虑使用nel[i]表示i位置的下一个Lner[i]表示i位置的下一个R。3 我们通过遍历字符串t通过判断t[i]能否跳到t[i 1]若全部可以实现则输出YES否则输出NO。4 注意有两个特判特判1t字符串第一个如果是R那么s第一个也必须是R否则无法消除输出NO。特判2t字符串最后一个如果是L那么s最后一个也必须是L否则无法消除输出NO。代码#includebits/stdc.h#defineintlonglong#defineendl\nusingnamespacestd;constintN1000010;constintmod998244353;intnel[N],ner[N];// 记录下一个l和下一个r的位置intn,m,q;string s,temp;voidsolve_string(intnowl,intnowr){cintemp;mtemp.length();for(inti0;im;i){if(temp[i]L){if(nowl-1){coutNO\n;return;}else{if(nowrnowlnowr!-1)nowrner[nowl];nowlnel[nowl];}}else{if(nowr-1){coutNO\n;return;}else{if(nowlnowrnowl!-1)nowlnel[nowr];nowrner[nowr];}}}// 特判1if(temp[0]Rs[0]!R){coutNO\n;return;}// 特判2if(temp[m-1]Ls[n-1]!L){coutNO\n;return;}coutYES\n;}voidsolve(){cins;ns.length();// 下一个l和r的位置intnowl-1,nowr-1;for(intin-1;i0;--i){nel[i]nowl,ner[i]nowr;if(s[i]L)nowli;elsenowri;}cinq;while(q--){solve_string(nowl,nowr);}}signedmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);intt1;cint;while(t--){solve();}return0;}