思维,其实也是前缀和的相关知识,就是到相对应的位置减上次保留的位置
解题思路:
- 首先我们分为3种情况,NLK,当为N时,我们x, y 都加1(x, y 分别代表LK),然后遇到相应的就–,最后我们判断当前的个数与之前个数,取最大距离值即可
代码:
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
map <PII,int> mp;
char st[200010]; // 注意数组大小
int main(){
int n;
scanf("%d",&n);
scanf("%s",st + 1);
int res = 0;
int x = 0, y = 0;
mp[make_pair(0,0)] = 0;
for (int i = 1; i <= n; i++){
if (st[i] == 'N'){
x ++, y++;
}
else if (st[i] == 'K'){
x--;
}
else{
y--;
}
if (mp.find(make_pair(x,y)) == mp.end()){ // 注意find
mp[make_pair(x,y)] = i;
}
else{
res = max(res,i - mp[make_pair(x,y)]);
}
}
printf("%d\n",res);
return 0;
}