BZOJ 2213: [Poi2011]Difference 细节题

大体上的思路不算太难,但是细节巨多无比.               

注意我们必须要选一个,所以在记录极差的同时还要记录一下上一次出现的位置. 

code: 

#include <cstdio> 
#include <algorithm>  
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std; 
const int N=1e6+7,M=27;      
int n,ans; 
int last[M],num[N],p[M][M],minv[M][M];     
char str[N];
int main() 
{ 
    // setIO("input"); 
    int i,j;   
    scanf("%d%s",&n,str+1);    
    for(i=1;i<=n;++i) 
    {
        int c=str[i]-'a';    
        ++num[c],last[c]=i;    
        for(j=0;j<26;++j) 
        {
            if(j!=c&&num[j]) 
            {
                ans=max(ans,max(num[c]-num[j]-minv[c][j]-(last[j]==p[c][j]),num[j]-num[c]-minv[j][c]-(last[c]==p[j][c])));   
            }
        }    
        for(j=0;j<26;++j) 
        {
            if(num[j]-num[c]<minv[j][c]) 
            {
                minv[j][c]=num[j]-num[c];   
                p[j][c]=i;  
            }
        }
    }  
    printf("%d
",ans); 
    return 0; 
}

  

原文地址:https://www.cnblogs.com/guangheli/p/12098914.html