4.14 每日一题题解

牛牛的牛可乐

涉及知识点:

  • 思维/STL

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\n",ans);
    return 0;
}
posted @ 2020-04-14 10:38  QFNU-ACM  阅读(128)  评论(0编辑  收藏  举报