QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#393331#6366. Messagezjy0001WA 1ms9776kbC++142.1kb2024-04-18 15:17:482024-04-18 15:17:49

Judging History

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

  • [2024-04-18 15:17:49]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:9776kb
  • [2024-04-18 15:17:48]
  • 提交

answer

#include<bits/stdc++.h>
#define LL long long
#define LLL __int128
#define uint unsigned
#define ldb long double
#define uLL unsigned long long
using namespace std;
const int N=2e5+5,M=60;const LL INF=1e18;
int n,m,An,Al[M],Ar[M],a[N],Q[N],id[N],kmp[N],L[26],R[26];string S,T;
bool vs[26],vx[M][26];LL pre[N],dp[N],dq[N];
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    cin>>S>>T,n=S.length(),m=T.length(),S=' '+S+' ',T=' '+T+' ';
    for(int i=1;i<=n;++i)cin>>a[i];
    fill(L,L+26,m+1),fill(R,R+26,0);
    for(int i=1;i<=m;++i)
        L[T[i]-'a']=min(L[T[i]-'a'],i),
        R[T[i]-'a']=max(R[T[i]-'a'],i);
    Al[++An]=1;
    for(int i=1;i<=m;++i){
        if(L[T[i]-'a']==i)Ar[An]=i-1,copy(vs,vs+26,vx[An]),vs[T[i]-'a']=1,Al[++An]=i;
        if(R[T[i]-'a']==i)Ar[An]=i,copy(vs,vs+26,vx[An]),vs[T[i]-'a']=0,Al[++An]=i+1;
    }
    Ar[An]=m;
    fill(dq,dq+n+1,INF);
    for(int i=0;i<=An;++i){
        copy(dq,dq+n+1,dp);
        fill(dq,dq+n+1,INF);
        if(i<2)dp[0]=0;
        int q=0;
        for(int j=1;j<=n;++j)
            if(vx[i+1][S[j]-'a'])Q[id[j]=++q]=j,pre[j]=pre[j-1];
            else id[j]=q+1,pre[j]=pre[j-1]+a[j];
        const int lp=Al[i+1],rp=Ar[i+1];
        for(int i=2,j=0;i<=rp-lp+1;++i){
            for(;j&&T[lp+i-1]!=T[lp+j];j=kmp[j]);
            kmp[i]=(j+=(T[lp+i-1]==T[lp+j]));
        }
        int cur=1,pos=0;
        const auto KMP=[&](const int&n){
            for(;cur<=n;++cur){
                for(;pos&&(pos>rp-lp||T[lp+pos]!=S[Q[cur]]);pos=kmp[pos]);
                pos+=(T[lp+pos]==S[Q[cur]]);
            }
            return pos;
        };
        for(int j=0;j<=n;++j)if(dp[j]<INF){
            if(!vx[i][S[j+1]-'a'])dp[j+1]=min(dp[j+1],dp[j]+a[j+1]);
            if(Al[i+1]>Ar[i+1]){
                if(!vx[i][S[j+1]-'a'])dq[j+1]=min(dq[j+1],dp[j]+a[j+1]);
                dq[j]=min(dq[j],dp[j]);
            }
            else if(j<n){
                int l=id[j+1],r=id[j+1]+rp-lp;
                if(r<=q&&KMP(r)==rp-lp+1)dq[Q[r]]=min(dq[Q[r]],dp[j]+pre[Q[r]]-pre[j]);
            }
        }
    }
    if(dp[n]<INF)cout<<dp[n];else cout<<-1;
    return 0;
}
/*
*/

詳細信息

Test #1:

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

input:

ababccb
abc
7 2 2 4 3 2 1

output:

7

result:

ok single line: '7'

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 5696kb

input:

babab
baab
2 1 3 2 4

output:

-1

result:

wrong answer 1st lines differ - expected: 'You better start from scratch man...', found: '-1'