- Sources:K- LR String
- Abstract:给定仅由
L
与R
构成的原字符串
S
(
1
≤
∣
S
∣
≤
5
×
1
0
5
)
S(1\le |S|\le5\times 10^5)
S(1≤∣S∣≤5×105),其中L
可删除其左侧字符,R
可删除其右侧字符。给出
q
(
1
≤
q
≤
5
×
1
0
5
)
q(1\le q\le5\times 10^5)
q(1≤q≤5×105)组询问,每次询问包含一个字符串
T
(
1
≤
∣
T
i
∣
≤
∣
S
∣
)
T(1\le |T_i|\le |S|)
T(1≤∣Ti∣≤∣S∣),判断
T
T
T是否经由
S
S
S修改得到。(
∑
(
∣
S
∣
+
q
+
∣
T
i
∣
)
≤
1
0
6
\sum(|S|+q+|T_i|)\le 10^6
∑(∣S∣+q+∣Ti∣)≤106) - Keyword:字符串(签到题)
- Solution:注意到
S
S
S中,当
L
出现在开头或R
出现在末尾时,其将永远无法删除,因此当s.front()=='L'&&s.front()!=t.front()
或s.back()=='R'&&s.back()!=t.back()
可直接判定无解。由于
T
T
T一定为
S
S
S删除某些字符得到,因此问题转换为判定
T
T
T是否为
S
S
S的子序列。注意到数据范围非常大,需设计
O
(
n
)
O(n)
O(n)的算法判断子序列。 - Code:
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int ll
#define endl "\n"
const int INF=__INT_MAX__;
void solve(){
string s;cin>>s;
vector<int>nxt_l(s.size(),INF),nxt_r(s.size(),INF);
int l=INF,r=INF;
for(int i=s.size()-1;i>=0;i--){
nxt_l[i]=l,nxt_r[i]=r;
if(s[i]=='L') l=i;
else r=i;
}
int q;cin>>q;
while(q--){
string t;cin>>t;
bool ok=1;
if ((s[0]=='L'&&s[0]!=t[0])||(s[s.size()-1]=='R'&&t[t.size()-1]!=s[s.size()-1])) {
cout<<"NO"<<'\n';
continue;
}
int idx=(t[0]=='L')?l:r;
if (idx>=s.size()) {
cout<<"NO"<<'\n';
continue;
}
for (int i=1;i<t.size();i++) {
idx=(t[i]=='L')?nxt_l[idx]:nxt_r[idx];
if (idx>=s.size()) {
ok=0;
break;
}
}
if(ok) cout<<"YES"<<'\n';
else cout<<"NO"<<'\n';
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具