QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#697840#7780. Dark LaTeX vs. Light LaTeX123456zmyTL 1ms4056kbC++173.2kb2024-11-01 16:00:432024-11-01 16:00:45

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-01 16:00:45]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:4056kb
  • [2024-11-01 16:00:43]
  • 提交

answer

#include<bits/stdc++.h>
#define int long long
using namespace std;
mt19937_64 gen(chrono::system_clock::now().time_since_epoch().count());
const int mod = (int)1e16 + gen() % (int)1e16, base = gen() % 100 + 100;

vector<int> b{ 1 };
struct Hash {
    vector<int> h{ 0 };
    void append(auto& s) {
        for (auto x : s)
            h.push_back((h.back() * base + x) % mod);
        for (int i = b.size(); i <= s.size(); i++)
            b.push_back((b.back() * base) % mod);
    }
    int query(int l, int r) {
        if (l > r || l < 1 || r >= h.size())
            return gen();
        int x = h[r] - (__int128)h[l - 1] * b[r - l + 1] % mod;
        return x + (x < 0) * mod;
    }
    Hash() {}
    Hash(auto& s) {
        append(s);
    }
};

void solve()
{
    auto lcp = [&](Hash& a, int x, Hash& b, int y) {
        // ?????????0
        int l = 0, r = a.h.size();
        while (l < r) {
            int mid = (l + r + 1) / 2;
            if (a.query(x, x + mid - 1) == b.query(y, y + mid - 1))
                l = mid;
            else
                r = mid - 1;
        }
        return l;
    };
    auto lcs = [&](Hash& a, int x, Hash& b, int y) {
        // ?????????0
        int l = 0, r = a.h.size();
        while (l < r) {
            int mid = (l + r + 1) / 2;
            if (a.query(x - mid + 1, x) == b.query(y - mid + 1, y))
                l = mid;
            else
                r = mid - 1;
        }
        return l;
    };
    string s,t;
    cin>>s>>t;
    Hash hs(s),ht(t);
    s=" "+s,t=" "+t;
    vector<vector<short>>cnts(s.size()+1,vector<short>(s.size()+1));
    vector<vector<short>>cntt(t.size()+1,vector<short>(t.size()+1));
	vector<vector<short>>anss=cnts,anst=cntt;
	for(int i=1;i<s.size();i++)
	{
		for(int j=1;j<t.size();j++)
		{
			int tmp=lcp(hs,i,ht,j);
			++cnts[i][i];
			--cnts[i][i+tmp];
			++cntt[j][j];
			--cntt[j][j+tmp];
		}
	}
	for(int i=1;i<s.size();i++)
	{
		for(int j=i+1;j<s.size();j++)
		{
			int tmp=min(j-i,lcp(hs,i,hs,j));
			++anss[i][j-1];
			--anss[i+1+tmp][j-1];
		}
		++anss[i][s.size()-1];
		--anss[i+1][s.size()-1];
	}
	for(int i=1;i<t.size();i++)
	{
		for(int j=i+2;j<t.size();j++)
		{
			int tmp=min(j-i,lcp(ht,i,ht,j));
			++anst[i+1][j-1];
			--anst[i+1+tmp][j-1];
		}
	}
	int ans=0;
	for(int i=1;i<s.size();i++)
		for(int j=i;j<s.size();j++)
			cnts[i][j]+=cnts[i][j-1],
			anss[i][j]+=anss[i-1][j],
			ans+=1ll*cnts[i][j]*anss[i][j];
	for(int i=1;i<t.size();i++)
		for(int j=i;j<t.size();j++)
			cntt[i][j]+=cntt[i][j-1],
			anst[i][j]+=anst[i-1][j],
			ans+=1ll*cntt[i][j]*anst[i][j];
//	for(int i=1;i<s.size();i++,puts(""))
//		for(int j=i;j<s.size();j++)
//			printf("%d ",cnts[i][j]);
//	puts("");
//	for(int i=1;i<t.size();i++,puts(""))
//		for(int j=i;j<t.size();j++)
//			printf("%d ",cntt[i][j]);
//	puts("");
//	for(int i=1;i<s.size();i++,puts(""))
//		for(int j=i;j<s.size();j++)
//			printf("%d ",anss[i][j]);
//	puts("");
//	for(int i=1;i<t.size();i++,puts(""))
//		for(int j=i;j<t.size();j++)
//			printf("%d ",anst[i][j]);
//    puts("");
	printf("%lld\n",ans);
}

signed main()
{
	solve();
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 3816kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 0ms
memory: 4056kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 0ms
memory: 3800kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3840kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 1ms
memory: 3792kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Time Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: