cjb-poi2011difference

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define PI 3.1415926535897932384626433
#define N 1000010
#define LF double
int n;
char s[N];
int a[N];
int ans=0;
vector<int> f[30];
void fuck(int x,int y)
{

    int tot=0;
    int h1=0,h2=0,cntx=f[x].size(),cnty=f[y].size();
    if (!cntx || !cnty)return;
    while (h1<cntx && h2<cnty)
        if (f[x][h1]<f[y][h2])a[++tot]=1,h1++;
        else a[++tot]=-1,h2++;
    for(int i=h1;i<cntx;i++)a[++tot]=1;
    for(int i=h2;i<cnty;i++)a[++tot]=-1;
    int now=0,flag=0;
    rep(i,tot)
    {
        now+=a[i];
        if (a[i]==-1)flag=1;
        if(flag)ans=max(ans,now);
        if (now<0)flag=now=0;
    }
    ans=max(ans,now-1); // 因为两种字母一定至少有一个,不加这句特判会导致末尾一段连续的1会被忽略。
}
int main()
{
    cin>>n;
    scanf("%s",s+1);
    rep(i,n)f[s[i]-'a'].pb(i);
    for(int i=0;i<26;i++)
        for(int j=0;j<26;j++)
            if (i!=j)fuck(i,j);
    cout<<ans<<endl;
}

/*
4
baaa
*/
}}}
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#define rep(i,n) for(int i=1;i<=n;i++)
#define mp make_pair
#define pb push_back
using namespace std;
#define PI 3.1415926535897932384626433
#define N 1000010
#define LF double
int n;
char s[N];
int a[N];
int ans=0;
vector<int> f[30];
void fuck(int x,int y)
{
    int tot=0;
    int h1=0,h2=0,cntx=f[x].size(),cnty=f[y].size();
    if (!cntx || !cnty)return;
    while (h1<cntx && h2<cnty)
        if (f[x][h1]<f[y][h2])a[++tot]=1,h1++;
        else a[++tot]=-1,h2++;
    for(int i=h1;i<cntx;i++)a[++tot]=1;
    for(int i=h2;i<cnty;i++)a[++tot]=-1;
    int now=0,flag=0;
    rep(i,tot)
    {
        now+=a[i];
        if (a[i]==-1)flag=1;
        if(flag)ans=max(ans,now);
        if (now<0)flag=now=0;
    }
    ans=max(ans,now-1); // 因为两种字母一定至少有一个,不加这句特判会导致末尾一段连续的1会被忽略。
}
int main()
{
    cin>>n;
    scanf("%s",s+1);
    rep(i,n)f[s[i]-'a'].pb(i);
    for(int i=0;i<26;i++)
        for(int j=0;j<26;j++)
            if (i!=j)fuck(i,j);
    cout<<ans<<endl;
}
/*
4
baaa
*/