[JOISC2014]JOIOJI
题目大意:
给你一串仅包含'J''O''I'的字符串,问满足三种字符出现次数相等的最大字串是多少?
思路:
用map存一下出现次数前缀和两两之差出现的最早位置,每次看一下当前的两两之差最早的出现位置是多少。
1 #include<map> 2 #include<cstdio> 3 #include<cctype> 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 inline char getalpha() { 12 register char ch; 13 while(!isalpha(ch=getchar())); 14 return ch; 15 } 16 std::map<std::pair<int,int>,int> map; 17 int main() { 18 const int n=getint(); 19 int ans=0; 20 map[std::make_pair(0,0)]=0; 21 for(register int i=1,s[3]={0,0,0};i<=n;i++) { 22 char ch=getalpha(); 23 if(ch=='J') s[0]++; 24 if(ch=='O') s[1]++; 25 if(ch=='I') s[2]++; 26 std::pair<int,int> p=std::make_pair(s[1]-s[0],s[2]-s[0]); 27 if(map.count(p)) { 28 ans=std::max(ans,i-map[p]); 29 } else { 30 map[p]=i; 31 } 32 } 33 printf("%d\n",ans); 34 return 0; 35 }