2 条题解

  • 0
    @ 2025-10-8 17:05:27
    #include<bits/stdc++.h>
    using namespace std;
    const int N=510000;
    char a[N], s1[2*N], s2[2*N];
    int d[2*N], n;
    void get_d()
    {
        s1[0]='$'; s1[1]='#';
        for(int i=1; i<=n; i++) {
            s1[2*i] = a[i];
            s2[2*i] = a[i] ^ 1;
            s1[2*i+1] = s2[2*i+1] = '#';
        }
        n = 2*n + 1;
        memset(d, 0, sizeof(d)); d[1] = 1;
        for(int i=2, L=1, R=1; i<=n; i++) {
            if(i <= R) d[i] = min(d[R - i + L], R - i + 1);
            while(s1[i - d[i]] == s2[i + d[i]]) d[i]++;
            if(i + d[i] - 1 > R) {
                L = i - d[i] + 1;
                R = i + d[i] - 1;
            }
        }
    }
    int main()
    {
        scanf("%d%s", &n, a + 1);
        get_d();
        long long ans = 0;
        for(int i=1; i<=n; i++) ans += (d[i] - 1)/2;
        printf("%lld\n", ans);
        return 0;
    }
    
    • 0
      @ 2025-10-8 17:05:16
      #include<bits/stdc++.h>
      using namespace std;
      const int N=510000;
      char a[N],s1[2*N],s2[2*N];
      int d[2*N],n;
      void get_d()
      {
      	s1[0]=s2[0]='$';s1[1]=s2[1]='#';
      	for(int i=1;i<=n;i++)s1[2*i]=a[i],s2[2*i]=a[i]^1,s1[2*i+1]=s2[2*i+1]='#';
      	n=2*n+1;
      	memset(d,0,sizeof(d));d[1]=1;
      	for(int i=2,L=1,R=1;i<=n;i++)
      	{
      		if(i<=R) d[i]=min(d[R-i+L],R-i+1);
      		while( s1[i-d[i]]==s2[i+d[i]])  d[i]++;
      		if(i+d[i]-1>R) L=i-d[i]+1,R=i+d[i]-1;
      	}
      }
      int main()
      {
          scanf("%d%s",&n,a+1);
          get_d();
          long long  ans=0;
          for(int i=1;i<=n;i++) ans+=(d[i]-1)/2;
          printf("%lld\n",ans);
          return 0;
      }
      • 1

      信息

      ID
      3749
      时间
      1000ms
      内存
      32MiB
      难度
      10
      标签
      递交数
      4
      已通过
      3
      上传者