QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#610955#7780. Dark LaTeX vs. Light LaTeXcrychicTL 4ms105968kbC++209.2kb2024-10-04 18:14:392024-10-04 18:14:40

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-10-04 18:14:40]
  • 评测
  • 测评结果:TL
  • 用时:4ms
  • 内存:105968kb
  • [2024-10-04 18:14:39]
  • 提交

answer

#include <bits/stdc++.h>
#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
using namespace std;
using ll = long long;
struct SA{
	vector<int> sa,rk,height;
	SA(string s){
		int n = s.size() - 1;
		int i,m = 256,p,w;
		rk.resize(n + 1),sa.resize(n + 1),height.resize(n + 1);
		vector<int> oldrk((n + 1) << 1),id(n + 1,0),key1(n + 1,0),cnt(max(n + 1,300),0);
		for (i = 1; i <= n; ++i) 
			++cnt[rk[i] = s[i]];
		for (i = 1; i <= m; ++i) 
			cnt[i] += cnt[i - 1];
		for (i = n; i >= 1; --i) 
			sa[cnt[rk[i]]--] = i;
		auto cmp = [&](int x, int y, int w) ->bool{
			return oldrk[x] == oldrk[y] && oldrk[x + w] == oldrk[y + w];
		};
		for (w = 1;; w <<= 1, m = p) { 
			for (p = 0, i = n; i > n - w; --i) id[++p] = i;
			for (i = 1; i <= n; ++i)
			if (sa[i] > w) id[++p] = sa[i] - w;
			fill(cnt.begin() + 1,cnt.end(),0);
			for (i = 1; i <= n; ++i) ++cnt[key1[i] = rk[id[i]]];
			for (i = 1; i <= m; ++i) cnt[i] += cnt[i - 1];
			for (i = n; i >= 1; --i) sa[cnt[key1[i]]--] = id[i];
			for(int i = 1;i <= n;i ++)
				oldrk[i] = rk[i];
			for (p = 0, i = 1; i <= n; ++i)
			rk[sa[i]] = cmp(sa[i], sa[i - 1], w) ? p : ++p; 
			if (p == n) {
			break;
			}
		}
		int k;
		for (i = 1, k = 0; i <= n; ++i) {
			if (rk[i] == 0) continue;
			if (k) --k;
			while (s[i + k] == s[sa[rk[i] - 1] + k]) ++k;
			height[rk[i]] = k;
		}
		return ;
	}
	vector<int> getsa(){
		return sa;
	}
	vector<int> getrk(){
		return rk;
	}
	vector<int> getheight(){
		return height;
	}
};
template <typename T>
class ST{
    vector<vector<T>> node;
    vector<int> Log_2;
    static T default_func(const T& a, const T& b){
        return min(a,b);
    }
    function<T(const T&, const T& )> op;
    public:
    ST(vector<T> &a, function <T(const T&, const T& )> _func = default_func){
        int len = a.size();
        op = _func;
        Log_2.resize(len + 1);
        for(int i = 2; i <= len; i++){
            Log_2[i] = Log_2[i >> 1] + 1;
        }
        int l1 = Log_2[len] + 1;
        node.resize(len + 1,vector<T>(l1,0));
        for(int i = 0;i < len;i++){
            node[i][0] = a[i];
        }
        for(int j = 1; j < l1;j ++){
            int pj = (1 << (j - 1));
            for(int i = 0;i + pj < len;i++){
                node[i][j] = op(node[i][j - 1],node[i + pj][j - 1]);
            }
        }
    }
    T query(int l,int r){
        int lt = Log_2[r - l + 1];
        return op(node[l][lt],node[r - (1 << lt) + 1][lt]);
    }
};
const int MAXLEN = 5010;
struct SAM{
    struct state {
    int len = 0, link = 0;
    int cnt = 0;
    array<int, 26> next = {0};
    };
    state st[MAXLEN * 2];
    vector<int> e[MAXLEN * 2];
    int sz, last;
    void sam_init() {
    st[0].len = 0;
    st[0].link = -1;
    st[0].cnt = 0;
    sz++;
    last = 0;
    return ;
    }
    void sam_extend(int c) {
    int cur = sz++;
    st[cur].len = st[last].len + 1;
    st[cur].cnt = 1;
    int p = last;
    while (p != -1 && !st[p].next[c]) {
        st[p].next[c] = cur;
        // st[st[p].link].cnt += st   
        p = st[p].link;
    }
    if (p == -1) {
        st[cur].link = 0;
    } else {
        int q = st[p].next[c];
        if (st[p].len + 1 == st[q].len) {
        st[cur].link = q;
        } else {
        int clone = sz++;
        st[clone].len = st[p].len + 1;
        st[clone].next = st[q].next;
        st[clone].link = st[q].link;
        while (p != -1 && st[p].next[c] == q) {
            st[p].next[c] = clone;
            p = st[p].link;
        }
        st[q].link = st[cur].link = clone;
        }
    }
    last = cur;
    return ;
    }
    void initg(){
        for(int i = sz - 1;i >= 1;i --){
            e[st[i].link].push_back(i);
        }
        return ;
    }
    void getcnt(int u){
        for(int i = 0;i < e[u].size();i ++){
            int v = e[u][i];
            getcnt(v);
            st[u].cnt += st[v].cnt;
        }
    }
}sam_s,sam_t;
const int N = 5000 + 50;
int cnt[N][N];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    string s,t;
    cin >> s >> t;
    s = ' ' + s;
    t = ' ' + t;
    SA sa_s(s),sa_t(t);
    // cerr << "?" << '\n';
    int n = s.size() - 1,m = t.size() - 1;
    // cerr << "?" << '\n';
    sam_s.sam_init();
    // cerr << "?" << '\n';
    for(int i = 1;i <= n;i ++){
        sam_s.sam_extend(s[i] - 'a');
        // cerr << i << '\n';
    }
    sam_s.initg();
    sam_s.getcnt(0);
    // cerr << "sam_s.size = " << sam_s.sz << endl;
    sam_t.sam_init();
    for(int i = 1;i <= m;i ++){
        sam_t.sam_extend(t[i] - 'a');
    }
    sam_t.initg();
    sam_t.getcnt(0);

    memset(cnt,sizeof(cnt),0);// n2
    vector<int> heights = sa_s.getheight();
    ST<int> s_heights(heights);
    vector<int> pre(n + 1);
    for(int i = 1;i <= n;i ++){
        fill(pre.begin(),pre.end(),0);
        int r = sa_s.getsa()[i];
        // cout << "!" << r << '\n';
        for(int j = 1;j <= n;j ++){
            int ql = i,qr = j;    
            if(ql > qr) swap(ql,qr);
            int l = sa_s.getsa()[j];
            int len = 0;
            if(l < r){
                if(ql < qr)len =  s_heights.query(ql + 1,qr);
                if(len > 0){
                    pre[l + 1] ++;
                    pre[l + len + 1] --;
                }
            }
        }
        for(int j = 1;j < r;j ++){
            pre[j] += pre[j - 1];
            cnt[j][r - 1] += pre[j];
        }
    }
    // for(int i = 1;i <= n;i ++){
    //     for(int j = 1;j <= n;j ++){
    //         cerr << cnt[i][j] << ' ';
    //     }
    //     cerr << '\n';
    // }
    ll ans = 0;
    for(int i = 1;i <= n;i ++){
        int cur = 0;
        for(int j = i;j <= n;j ++){
            cur = sam_t.st[cur].next[s[j] - 'a'];
            if(cur == 0)break;
            ans += cnt[i][j] * sam_t.st[cur].cnt;
        }
    }
    // cerr << "?" << '\n';
    memset(cnt,0,sizeof(cnt));
    // for(int i = 1;i <= m;i ++){
    //     for(int j = 1;j <= m;j ++){
    //         cerr << cnt[i][j] << ' ';
    //     }
    //     cerr << '\n';
    // }
    heights = sa_t.getheight();
    s_heights = ST<int>(heights);
    // cerr << "?" << '\n';
    pre.resize(m + 1);
    for(int i = 1;i <= m;i ++){
        fill(pre.begin(),pre.end(),0);
        int r = sa_t.getsa()[i];
        // cout << "!" << r << '\n';
        for(int j = 1;j <= m;j ++){
            int ql = i,qr = j;    
            if(ql > qr) swap(ql,qr);
            int l = sa_t.getsa()[j];
            int len = 0;
            if(l < r){
                if(ql < qr)len =  s_heights.query(ql + 1,qr);
                if(len > 0){
                    pre[l + 1] ++;
                    pre[l + len + 1] --;
                }
            }
            
        }
        for(int j = 1;j < r;j ++){
            pre[j] += pre[j - 1];
            cnt[j][r - 1] += pre[j];
        }
    }
    // cerr << "?" << '\n';
    // for(int i = 1;i <= m;i ++){
    //     for(int j = 1;j <= m;j ++){
    //         cerr << cnt[i][j] << ' ';
    //     }
    //     cerr << '\n';
    // }
    for(int i = 1;i <= m;i ++){
        int cur = 0;
        for(int j = i;j <= m;j ++){
            cur = sam_s.st[cur].next[t[j] - 'a'];
            if(cur == 0)break;
            ans += (cnt[i][j] + 1) * sam_s.st[cur].cnt;
        }
    }
    cout << ans << '\n';
}

詳細信息

Test #1:

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

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 3ms
memory: 105864kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

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

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

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

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: 0
Accepted
time: 4ms
memory: 105908kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

1161

result:

ok 1 number(s): "1161"

Test #6:

score: -100
Time Limit Exceeded

input:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:


result: