2 条题解
-
-2
读懂题意后,第一反应应该是
如果反应力不够的话,那么第二反应就应该是
好了,我们姑且认为你会了,就这些
简述做法:考虑前缀和,分别把'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
- 上传者