https://codeforces.com/contest/1234/problem/C
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
ll q,n;
string s[2];
void solve(){
cin>>n>>s[0]>>s[1];
int x=0,y=0,dir=0;//初始左右
bool flag=1;
while(y<=n-1){
if(dir==0){
if(s[x][y]=='1' || s[x][y]=='2'){//左右来左右去
y++;
}
else{ //左右方向来 上下去
dir=1;
x=!x; //x上下趋势
}
}
else{
if(s[x][y]=='1' || s[x][y]=='2' )//不可能上下方向来 上下方向去
{
flag=0;
break;
}
else{ //下右 上右 上下来 左右去
y++;
dir=0;
}
}
}
if(flag && x==0)
flag=0;
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
int main(){
cin>>q;
while(q--){
solve();
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int q,n;
int flag;
char a[2][200020];
//1左 2下 3右 4上
void dfs(int x,int y,int ss)//从a[x][y]流过来,方向ss
{
if(y>=n)
return;
if(x==1&&y==n-1&&ss==3)//x、y表示已经走到右下角了,ss=3表示是横着流出去的,符合题意
{
flag=1;
return;
}
if(x==0)//从上一行流过来的,方向只能是向下或者向右
{
if(ss==2)//判断的流过来的方向是怎么样的,向下流过来的
{
if(a[x+1][y]!='1'&&a[x+1][y]!='2')
dfs(x+1,y,3);
}
else if(ss==3)//向右流过来的
{
if(a[x][y+1]=='1'||a[x][y+1]=='2')
dfs(x,y+1,3);
else dfs(x,y+1,2);
}
}
else if(x==1)//从下一行流过来的,方向只能是向上或者向右
{
if(ss==4)//上
{
if(a[x-1][y]!='1'&&a[x-1][y]!='2')
dfs(x-1,y,3);
}
else if(ss==3)//右
{
if(a[x][y+1]=='1'||a[x][y+1]=='2')
dfs(x,y+1,3);
else
dfs(x,y+1,4);
}
}
}
int main(){
cin>>q;
while(q--){
flag=0;
cin>>n>>a[0]>>a[1];
if(a[0][0]=='1' || a[0][0]=='2')
dfs(0,0,3);
else
dfs(0,0,2);
if(flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
D
给一个串S
1 修改pos位置为字符c
2 l-r内不同字符个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5;
int n,q,cnt;
ll a[maxn];
string s;
vector<set<int> > poss(26); //26个集合存位置
//set<int> poss[26];
int tp,pos,l,r;
char c;
int main(){
cin>>s;
int len=s.size();
for(int i=0;i<len;i++){
poss[s[i]-'a'].insert(i);
}
cin>>q;
for(int i=0;i<q;i++){
cin>>tp;
if(tp==1){
cin>>pos>>c;
--pos;
poss[s[pos]-'a'].erase(pos);
s[pos]=c;
poss[s[pos]-'a'].insert(pos);
}
else{
cnt=0;
cin>>l>>r;
--l;--r;
for(int i=0;i<26;i++){
auto p=poss[i].lower_bound(l);//该字母是否有>=l的位置
if(p!=poss[i].end() && *p<=r)
cnt++;
}
cout<<cnt<<endl;
}
}
return 0;
}