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\n",ans); return 0; }