QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#748085#7780. Dark LaTeX vs. Light LaTeXmonuiWA 35ms200228kbC++232.1kb2024-11-14 19:17:032024-11-14 19:17:04

Judging History

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

  • [2024-11-25 20:53:52]
  • hack成功,自动添加数据
  • (/hack/1258)
  • [2024-11-14 19:17:04]
  • 评测
  • 测评结果:WA
  • 用时:35ms
  • 内存:200228kb
  • [2024-11-14 19:17:03]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
#define lowbit(x) x&(-x)
const int N=5010;
const int M=1e9+7;
string a,b;
map<int,int> st_a,st_b;
int na,nb;

struct Fbit{
    vector<int> tree;
    int len;
    Fbit(int n=N){
        len=n;
        tree.resize(n);
        for(int i=0;i<N;i++) tree[i]=0;
    }
    void upd(int pos,int val){
        for(int i=pos;i<=len;i+=lowbit(i)) tree[i]+=val;
    }
    int get(int pos){
        int ans=0;
        for(int i=pos;i;i-=lowbit(i)) ans+=tree[i];
        return ans;
    }
};

int hash_a[N],hash_b[N];
int fac[N];
void init_init(){
    fac[0]=1;
    for(int i=1;i<N;i++){
        fac[i]=(fac[i-1]*29)%M;
    }
}

void init(string& s,int len,int* ans){
    for(int i=1;i<=len;i++){
        ans[i]=ans[i-1]*29+s[i]-'a'+1;
        ans[i]%=M;
    }
}

void calc(string& s,int len,map<int,int>& st,int* ans,int d){
    Fbit op[N];
    vector<int> lst(N,0);
    for(int i=1;i<=len;i++){
        for(int j=i+1;j<=len;j++){
            if(s[i]!=s[j]) continue;
            if(s[i-1]==s[j-1]) lst[j]=lst[j-1]+1;
            op[i+1].upd(j,-1);
            op[i+1].upd(j-lst[j]-1,1);
        }
    }
    for(int i=1;i<=len;i++){
        for(int j=i;j<=len;j++){
            int num=op[i].get(j)+d;
            int to=ans[j]-ans[i-1]*fac[j-i+1]%M;
            to=(to%M+M)%M;
            st[to]+=num;
        }
    }
}

int getans(string& s,int len,map<int,int>& st,int* ans){
    int res=0;
    for(int i=1;i<=len;i++){
        for(int j=i;j<=len;j++){
            int to=ans[j]-ans[i-1]*fac[j-i+1]%M;
            to=(to%M+M)%M;
            res+=st[to];
        }
    }
    return res;
}

void solve(){
    cin>>a>>b;
    na=a.size(),nb=b.size();
    a="#"+a;b="#"+b;
    init_init();
    init(a,na,hash_a);
    init(b,nb,hash_b);
    calc(a,na,st_a,hash_a,1);
    calc(b,nb,st_b,hash_b,0);
    int res=getans(a,na,st_b,hash_a)+getans(b,nb,st_a,hash_b);
    cout<<res<<endl;
}
signed main()
{
    ios::sync_with_stdio(0);cin.tie(0);
    int t=1;
    // cin>>t;
    while(t--)
        solve();
    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 35ms
memory: 200200kb

input:

abab
ab

output:

8

result:

ok 1 number(s): "8"

Test #2:

score: 0
Accepted
time: 20ms
memory: 199968kb

input:

abab
abaaab

output:

29

result:

ok 1 number(s): "29"

Test #3:

score: 0
Accepted
time: 23ms
memory: 199920kb

input:

abcd
abcde

output:

10

result:

ok 1 number(s): "10"

Test #4:

score: 0
Accepted
time: 20ms
memory: 200228kb

input:

aaba
ba

output:

6

result:

ok 1 number(s): "6"

Test #5:

score: -100
Wrong Answer
time: 27ms
memory: 200012kb

input:

babababaaabbaabababbbaabbbababbaaaaa
aaaabbaababbab

output:

2038

result:

wrong answer 1st numbers differ - expected: '1161', found: '2038'