QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#755947 | #7780. Dark LaTeX vs. Light LaTeX | Suhy | TL | 1038ms | 505376kb | C++11 | 3.1kb | 2024-11-16 18:28:57 | 2024-11-16 18:28:58 |
Judging History
answer
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#pragma GCC optimize(3)
using namespace std;
const int maxn = 10004;
const int p1 = 30000037;
const int p2 = 30000091;
const int p3 = 28734753;
const int b1 = 91;
class Hsh
{
public:
static const int w = 4, inf = 1000000009;
static const int Maxn = 5003, maxp = 33554432;
static int pwb[Maxn][w], mp[maxp][w];
static const int b[w], p[w];
int n, phsh[Maxn][w];
static void GetPow()
{
for(int i = 0; i < w; i ++)
{
pwb[0][i] = 1;
for(int j = 1; j < Maxn; j ++)
pwb[j][i] = 1ll * pwb[j - 1][i] * b[i] % p[i];
}
}
int mns(int x, int y, int p)
{return (x >= y) ? (x - y) : (x - y + p);}
void Bld(int s[], int N)
{
n = N;
for(int i = 1; i <= n; i ++)
for(int j = 0; j < w; j ++)
phsh[i][j] = (1ll * phsh[i - 1][j] * b[j] % p[j] + s[i]) % p[j];
}
int GetH(int l, int r, int w)
{return mns(phsh[r][w], 1ll * phsh[l - 1][w] * pwb[r - l + 1][w] % p[w], p[w]);}
int GetCnt(int l, int r)
{
int ans = inf;
for(int i = 0; i < w; i ++)
ans = min(ans, mp[GetH(l, r, i)][i]);
return ans;
}
void ModMap(int dlt)
{
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= i; j ++)
for(int k = 0; k < w; k ++)
mp[GetH(j, i, k)][k] += dlt;
}
};
int Hsh::mp[Hsh::maxp][Hsh::w], Hsh::pwb[Hsh::Maxn][Hsh::w];
const int Hsh::b[Hsh::w] = {31, 37, 29, 41}, Hsh::p[Hsh::w] = {30000037, 28983751, 30213037, 31982371};
int n, m;
int s[maxn], t[maxn];
ll ans;
Hsh hs, ht;
int f[maxn], cnt[maxn];
//babaa
void wok(int dlt)
{
for(int i = 2, l = 2 + dlt - n + 1, r = dlt; i < n; i ++, l ++)
{
int j = f[i - 1];
while(j > 0 && ((i + dlt > n && (i + dlt - j <= n || j + dlt >= n)) || s[j + 1 + dlt] != s[i + dlt]))
j = f[j];
if(s[j + 1 + dlt] == s[i + dlt])
j ++;
f[i] = j;
cnt[i] = 0;
if(j != 0) cnt[i] ++;
cnt[i] += cnt[j];
if(cnt[i] && l > 1 && r - l + 1 <= m)
ans += cnt[i] * hs.GetCnt(l, r);
}
}
void work(int w)
{
ht.ModMap(1);
for(int i = 1; i <= n; i ++)
s[i + n] = s[i];
for(int i = 1; i < n; i ++)
wok(i);
if(w) ht.ModMap(-1);
}
signed main()
{
Hsh::GetPow();
char c = getchar();
while('a' <= c && c <= 'z')
s[++ n] = c - 'a' + 1, c = getchar();
while(!('a' <= c && c <= 'z'))
c = getchar();
while('a' <= c && c <= 'z')
t[++ m] = c - 'a' + 1, c = getchar();
hs.Bld(s, n);
ht.Bld(t, m);
work(1);
//cout<<"-----"<<endl;
swap(n, m);
for(int i = 1; i <= max(n, m); i ++)
swap(s[i], t[i]);
swap(hs, ht);
work(0);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= i; j ++)
ans += hs.GetCnt(j, i);
cout<<ans<<endl;
}
详细
Test #1:
score: 100
Accepted
time: 1ms
memory: 6004kb
input:
abab ab
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 0ms
memory: 30568kb
input:
abab abaaab
output:
29
result:
ok 1 number(s): "29"
Test #3:
score: 0
Accepted
time: 0ms
memory: 14248kb
input:
abcd abcde
output:
10
result:
ok 1 number(s): "10"
Test #4:
score: 0
Accepted
time: 0ms
memory: 5904kb
input:
aaba ba
output:
6
result:
ok 1 number(s): "6"
Test #5:
score: 0
Accepted
time: 0ms
memory: 305712kb
input:
babababaaabbaabababbbaabbbababbaaaaa aaaabbaababbab
output:
1161
result:
ok 1 number(s): "1161"
Test #6:
score: 0
Accepted
time: 1038ms
memory: 504056kb
input:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
output:
78156256250000
result:
ok 1 number(s): "78156256250000"
Test #7:
score: 0
Accepted
time: 106ms
memory: 505376kb
input:
gzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggzggzgzggzggzgzggzgzggz...
output:
60716448
result:
ok 1 number(s): "60716448"
Test #8:
score: 0
Accepted
time: 108ms
memory: 504068kb
input:
mlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllmllmlmllmllmlmllmlmllmllmlmllmlmllml...
output:
60679828
result:
ok 1 number(s): "60679828"
Test #9:
score: -100
Time Limit Exceeded
input:
vbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvbbvbvbbvbbvbvbbvbvbbvb...