求S T2一严格线性解的证明
  • 板块学术版
  • 楼主robertuu
  • 当前回复8
  • 已保存回复8
  • 发布时间2023/10/22 16:20
  • 上次更新2023/11/2 11:52:45
查看原帖
求S T2一严格线性解的证明
477597
robertuu楼主2023/10/22 16:20

(考场打错了三个字符去世了……)

#include<iostream>
using namespace std;
char s[2000001];
int dp[2000001],head[2000001],lst[26][2000001];
int main()
{
    //freopen("game.in","r",stdin);
    //freopen("game.out","w",stdout);
    int n;
    scanf("%d",&n);
    scanf("%s",s+1);
    long long ans = 0,sz = 1;
    head[0] = 1;
    for(int i = 1;i <= n;i++)
    {
        //cerr << i << endl;
        if(s[i-1] == s[i])
        {
            dp[i] = dp[i-2] + 1;
            head[i] = head[i-2];
            if(i > 2) lst[s[i-2]-'a'][head[i]] = i-2;
            head[i-2] = 0;
        }
        else if(lst[s[i]-'a'][head[i-1]])
        {
            dp[i] = dp[lst[s[i]-'a'][head[i-1]]-1] + 1;
            head[i] = head[lst[s[i]-'a'][head[i-1]]-1];
            if(lst[s[i]-'a'][head[i-1]] > 1)
                lst[s[lst[s[i]-'a'][head[i-1]]-1]-'a'][head[i]] = lst[s[i]-'a'][head[i-1]]-1;
            head[lst[s[i]-'a'][head[i-1]]-1] = 0;
        }
        else head[i] = ++sz;
        ans += dp[i];
    }
    printf("%lld",ans);
    return 0;
}

洛谷两套数据能AC,显然是严格线性的。

2023/10/22 16:20
加载中...