2 条题解

  • -2
    @ 2025-4-23 8:46:09

    读懂题意后,第一反应应该是

    这个

    如果反应力不够的话,那么第二反应就应该是

    这个


    好了,我们姑且认为你会了,就这些












































































































































































































































    简述做法:考虑前缀和,分别把'N''O''I'处理为-10000000000000000(或许更大或许更小),9999999999999999(或许更大或许更小),和1。由此一来我们只需找到和为0的最长区间,至于如何找前文已经给出,

    脑子都不用动一下

    code:

    #include<bits/stdc++.h>
    #define int long long
    using namespace std;
    inline int reads(){
    	int x=0,f=1;
    	char ch=getchar();
    	while(!isdigit(ch)){
    		if(ch=='-')f=-1;
    		ch=getchar();
    	}
    	while(isdigit(ch)){
    		x=(x<<1)+(x<<3)+(ch^48);
    		ch=getchar();
    	}
    	return x*f;
    }
    const int N=1e5+10;
    string s,ss;
    int n,now;
    int ans;
    int intmax=INT_MAX;
    unordered_map<int,int> mp;
    signed main(){
    //	freopen("AKNOI最长平衡子串ex.in","r",stdin);
    	n=reads();
    	cin>>ss;
    	s=" "+ss;
    //	mp[0]=-1;
    	for(int i=1;i<=n;i++){
    		if(s[i]=='N')now++;
    		if(s[i]=='O')now+=intmax;
    		if(s[i]=='I')now-=intmax+1;
    		if(mp[now]||!now){
    			ans=max(ans,i-mp[now]);
    //			printf("%lld时update\n",i);
    		}
    		else mp[now]=i;
    //		printf("%lld时,ans:%lld,now:%lld\n",i,ans,now);
    	}
    	cout<<ans;
    	return 0;
    }
    
    
    • 1

    信息

    ID
    173
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    (无)
    递交数
    66
    已通过
    18
    上传者