2 条题解
-
0
#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
#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
- 上传者