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 } 
原文地址:https://www.cnblogs.com/ccd2333/p/6375158.html