bzoj 4236JOIOJI
一开始忘掉特殊情况也是蛋疼2333(有一直到头的。mp[0][0]是要特判的)
做法也就是找mp[i][j]相同的东西。(貌似可以写成线性方程组(z=x+A,z=y+B)过这个的就是相等(可以先从2维考虑,y=x+B,就是相等的关系))
1 #include<bits/stdc++.h> 2 #define INF 0x7fffffff 3 #define LL long long 4 #define N 1000005 5 using namespace std; 6 inline int ra() 7 { 8 int x=0,f=1; char ch=getchar(); 9 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 10 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 11 return x*f; 12 } 13 map<int , map<int ,int > > mp; 14 char s[N<<1]; 15 int J,O,I,ans; 16 int main() 17 { 18 int n=ra(); scanf("%s",s+1); 19 for (int i=1; i<=n; i++) 20 { 21 if (s[i]=='J') J++; 22 if (s[i]=='O') O++; 23 if (s[i]=='I') I++; 24 if (I-O==0 && O-J==0) ans=max(i,ans); 25 else if (mp[O-J][I-O]==0) mp[O-J][I-O]=i; 26 else ans=max(i-mp[O-J][I-O],ans); 27 } 28 cout<<ans; 29 return 0; 30 }