涉及知识点:
solution:
- (题意是找长度最长且N K L数量相等的子串)
- (我们先考虑另一个简单的题目:)
- (一个长度为n,仅由"N","K"组成的字符串,请找出最长的、包含相同数目"N","K"的子串)
- (做法就是遍历字符串,记录N和K的差值x,用map记录差值,map[x] = i)
- (如果下一次差值等于x的下标为j,那么[i+1,j]是包含相同数目的"N","K")
- (回到这道题目,做法基本上一样:)
- (记录N和K的差值x,N和L的差值y,用map<pair(x,y)>记录差值,map<pair(x,y)> = i)
- (如果下一次差值等于pair(x,y)的下标为j,那么[i+1,j]是包含相同数目的"N","K","L”)
std:
#include <bits/stdc++.h>
using namespace std;
map< pair<int ,int> , int > mp;
char s[200005];
int main()
{
int n;
int x = 0 ,y = 0,ans = 0;
scanf("%d",&n);
scanf("%s",s+1);
mp[ make_pair(0 , 0) ] = 0;
for(int i=1;i<=n;i++){
if(s[i] == 'N')
x++,y++;
if(s[i] == 'K')
x--;
if(s[i] == 'L')
y--;
if(mp.find( make_pair(x,y) ) == mp.end())
mp[make_pair(x,y)] = i;
else
ans = max(ans , i - mp[ make_pair(x,y) ]);
}
printf("%d
",ans);
return 0;
}