Codeforces1073C——Vasya and Robot
阿新 • • 發佈:2018-11-02
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
const int INF=0x3f3f3f3f;
int n,x,y;
char s[N];
int pre[N][2];
bool check(int m){
for(int i=1;i+m-1<=n;i++){
//xx yy是整個序列減去中間修改部分剩下的序列所對應的x和y
int xx=pre[n][0]-pre[i+m-1][0]+pre[i-1][0];
int yy=pre[n] [1]-pre[i+m-1][1]+pre[i-1][1];
//tx ty是要修改的區間修改後應該對應的x和y
int tx=x-xx;
int ty=y-yy;
//如果區間長度m大於等於|tx|+|ty|而且m減去|tx|+|ty|剩下的是偶數的話,就可以把這些剩下的相互低效,然後其他就一直往一個方向走即達到目標
if(abs(tx)+abs(ty)<=m &&(m-abs(tx)-abs(ty))%2==0){
return true;
}
}
return false;
}
int main(void){
//freopen("data.txt","r",stdin);
scanf("%d",&n);
scanf("%s",s+1);
scanf("%d%d",&x,&y);
//預處理字首和 pre[i][0]代表x pre[i][1]代表y 比如RU 到R的位置x=1 y=0 到U的時候x=1 y=1
pre[0][0]=0;
pre[0][1]=0;
for(int i=1;i<=n;i++){
pre[i][0]=pre[i-1][0];
pre[ i][1]=pre[i-1][1];
if(s[i]=='U'){
pre[i][1]++;
}
else if(s[i]=='D'){
pre[i][1]--;
}
else if(s[i]=='L'){
pre[i][0]--;
}
else{
pre[i][0]++;
}
}
//二分答案(區間長度)
int l=0,r=n;
int m;
int ans=INF;
while(l<=r){
m=(l+r)>>1;
if(check(m)){
r=m-1;
//ans=min(ans,m);
ans=m;
}
else{
l=m+1;
}
}
if(ans==INF){
printf("-1\n");
return 0;
}
printf("%d\n",ans);
return 0;
}