TLE求助

CF17E Palisection

没有啊,AC呀
by kexiye @ 2024-01-29 16:30:39


不对啊,我这里提交好多次都TLE了
by hjfjwl @ 2024-01-29 16:31:36


@[hjfjwl](/user/374715) 这份代码是WA ```cpp #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 51123987; const int N = 4e6 + 5; int p[N]; int l[N]; int r[N]; signed main() { int n; scanf("%lld",&n); char t[4000005]; scanf("%s",t); char s[4000005]; s[0]='@'; s[1]='#'; int cur=1; int sb=strlen(t); for(register int i = 0;i < sb;i++) { s[++cur]=t[i]; s[++cur]='#'; } int m = strlen(s)-1; int mid = 0,rr = 0; int tot = 0; for(register int i = 1;i <= m;i++) { int j = mid * 2 -i; if(i <= rr)p[i] = min(p[j],rr - i+1); else p[i] = 1; while(s[i + p[i]] == s[i - p[i]]) { p[i]++; } int len = p[i] ; l[i - len + 1]++; l[i + 1]--; r[i]++; r[i + len]--; if(i + p[i] - 1 > rr) { rr = i + p[i]-1; mid =i; } tot += p[i] >> 1; tot %= mod; } for(register int i = 1;i <= m;i++) { l[i] += l[i - 1]; r[i] += r[i - 1]; l[i] %= mod; r[i] %= mod; } int sum = 0; int ans = 0; for(register int i = 2;i <= m - 2;i+=2) { sum += r[i]; sum %= mod; ans += sum * l[i+2]; ans %= mod; } printf("%lld\n",((tot * (tot - 1) >> 1 )% mod - ans + mod) % mod); return 0; }
by pig1121 @ 2024-01-29 16:47:27


@[hjfjwl](/user/374715) AC代码 ```cpp #include <bits/stdc++.h> using namespace std; #define int long long const int mod = 51123987; const int N = 4e6 + 5; int p[N]; int l[N]; int r[N]; signed main() { int n; scanf("%lld",&n); char t[4000005]; scanf("%s",t); char s[4000005]; s[0]='@'; s[1]='#'; int cur=1; int sb=strlen(t); for(register int i = 0;i < sb;i++) { s[++cur]=t[i]; s[++cur]='#'; } s[++cur]='&'; int m = strlen(s)-2; int mid = 0,rr = 0; int tot = 0; for(register int i = 1;i <= m;i++) { int j = mid * 2 -i; if(i <= rr)p[i] = min(p[j],rr - i+1); else p[i] = 1; while(s[i + p[i]] == s[i - p[i]]) { p[i]++; } int len = p[i] ; l[i - len + 1]++; l[i + 1]--; r[i]++; r[i + len]--; if(i + p[i] - 1 > rr) { rr = i + p[i]-1; mid =i; } tot += p[i] >> 1; tot %= mod; } for(register int i = 1;i <= m;i++) { l[i] += l[i - 1]; r[i] += r[i - 1]; l[i] %= mod; r[i] %= mod; } int sum = 0; int ans = 0; for(register int i = 2;i <= m - 2;i+=2) { sum += r[i]; sum %= mod; ans += sum * l[i+2]; ans %= mod; } printf("%lld\n",((tot * (tot - 1) >> 1 )% mod - ans + mod) % mod); return 0; }
by pig1121 @ 2024-01-29 16:50:37


@[hjfjwl](/user/374715) std::string常数很大
by pig1121 @ 2024-01-29 16:51:10


|