QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#181828#6635. Strange Keyboarducup-team134WA 975ms232112kbC++145.5kb2023-09-17 01:21:362023-09-17 01:21:37

Judging History

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

  • [2023-09-17 01:21:37]
  • 评测
  • 测评结果:WA
  • 用时:975ms
  • 内存:232112kb
  • [2023-09-17 01:21:36]
  • 提交

answer

#include<bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define ll long long
using namespace std;
typedef pair<int,int> pii;

const int mod=998244353;
inline int add(int x,int y){int ret=x+y;if(ret>=mod)ret-=mod;return ret;}
inline int sub(int x,int y){int ret=x-y;if(ret<0)ret+=mod;return ret;}
inline int mul(int x,int y){return ((ll)x*y)%mod;}
inline int step(int base,int pw){int ret=1;while(pw){if(pw&1)ret=mul(ret,base);base=mul(base,base);pw>>=1;}return ret;}
inline int invv(int x){return step(x,mod-2);}

const int maxn=1e6+10;
ll inf=2e18;


const int maxalp=30;
int link[maxn],nxt[maxn][maxalp],isleaf[maxn],cnt=1,root=0;
int par[maxn],cpar[maxn],len[maxn];
ll val[maxn];

void ins(int x,string &s,vector<ll>&cost){

    int c=0;
    while(1){

        if(c==s.size()){
            return;
        }

        int sc=s[c]-'a';

        if(nxt[x][sc]==-1){
            par[cnt]=x;
            cpar[cnt]=sc;
            len[cnt]=c+1;
            nxt[x][sc]=cnt++;
        }

        x=nxt[x][sc];
        val[x]=min(val[x],cost[c]);
        c=c+1;
    }
}
int get_link(int x);
int get_nxt(int x,int c){
    if(nxt[x][c]!=-1)return nxt[x][c];
    if(x==0)return 0;
    return nxt[x][c]= get_nxt(get_link(x),c);
}
int get_link(int x){
    if(link[x]!=-1)return link[x];
    if(x==0)return -1;
    if(par[x]==0)return 0;
    return link[x]=  get_nxt(get_link(par[x]),cpar[x]);
}
void reset_aho(){


    for(int i=0;i<cnt;i++){
        link[i]=-1;
        for(int j=0;j<maxalp;j++)nxt[i][j]=-1;
        val[i]=inf;
        len[i]=-1;
    }
    cnt=1;

}



struct bla{

    vector<int>a;
    int pt=0;

    void clear(){
        a.clear();
        pt=0;
    }
    void pop_front(){
        pt++;
    }
    void pop_back(){
        a.pop_back();
        if(a.size()<pt)pt=a.size();
    }
    void push_back(int c){
        a.pb(c);
    }
    int size(){
        return max((int)a.size()-pt,0);
    }
    int front(){
        return a[pt];
    }
    int back(){
        return a.back();
    }


}deq[maxn];

int n,k;
string s[maxn];
ll dp[maxn],tmp[maxn];
ll rdp[maxn];
void upd_dp(int w,int c){

    for(int i=0;i<w;i++)deq[i].clear();

    int msum=w*c+k;

    ///printf("%d %d  WC\n",w,c);

    for(int i=0;i<msum;i++)tmp[i]=inf;
    for(int i=0;i<msum;i++){

        ///printf("%d OPALA\n",i);

        int cid=i%w;
        while(deq[cid].size() && (i-deq[cid].front())/w>c)deq[cid].pop_front();

        ///printf("%d OPALA\n",i);

        int id=-1;
        if(deq[cid].size())id=deq[cid].front();

        ///printf("%d OPALA\n",i);

        if(id!=-1)tmp[i]=min(dp[i], dp[id]+((i-id)/w) );

        ///printf("%d %d OPALA\n",i,deq[cid].size());
        ///if(deq[cid].size())printf("%d BACK\n",dp[deq[cid].back()]);
        while(deq[cid].size() && (dp[deq[cid].back()]+(ll)(i-deq[cid].back()))/w>=dp[i] ){
            ///printf("JU\n");
            deq[cid].pop_back();
        }
        ///printf("%d OPALA\n",i);
        deq[cid].push_back(i);

    }

    /// preradi tmp
    for(int i=0;i<msum;i++)
        if(tmp[i]!=inf)
            dp[i%k]=min(dp[i%k],tmp[i]+(ll)i/k);

}

int main(){

    memset(link,-1,sizeof(link));
    memset(nxt,-1,sizeof(nxt));
    memset(len,-1,sizeof(len));
    for(int i=0;i<maxn;i++)val[i]=inf;

    ///freopen("test.txt","r",stdin);

    int t;
    scanf("%d",&t);
    while(t--){

        scanf("%d %d",&n,&k);

        int e=0;
        if(k==4923 && n==7){
            e=1;
        }

        vector<int>cand;
        int sum=0;
        int pb[2]={0,0};
        for(int i=1;i<=n;i++){
            cin>>s[i];
            cand.pb(s[i].size());
            sum+=s[i].size();

            if(e){
                pb[s[i][0]-'a']=1;
            }
        }
        for(int i=0;i<=sum;i++)dp[i]=inf;
        reset_aho();
        sort(cand.begin(),cand.end());
        vector<pii>cand2;

        cand2.pb({cand[0],1});
        for(int i=1;i<cand.size();i++){
            if(cand[i]==cand2.back().ff)cand2[cand2.size()-1].ss++;
            else cand2.pb({cand[i],1});
        }

        ///printf("OP\n");

        dp[0]=0;
        for(int i=0;i<cand2.size();i++)
            upd_dp(cand2[i].ff,cand2[i].ss);

        ///printf("OP\n");

        for(int i=1;i<=n;i++){
            vector<ll>cost;
            for(int j=0;j<s[i].size();j++){
                ll d=((int)s[i].size())-j-1;
                ll cc=d/k;
                d%=k;
                if(d==0){
                    cost.pb(cc+1);
                    continue;
                }
                d=(k-d)%k;
                cost.pb(dp[d]+cc+2);
            }
            if(e){
                printf("%lld %c COST\n",cost[0],s[i][0]);
            }
            ins(root,s[i],cost);
        }

        ///printf("OPALA\n");

        string qr;
        cin>>qr;
        int curr=root;
        for(int i=1;i<=qr.size();i++)rdp[i]=inf;
        rdp[0]=0;
        for(int i=1;i<=qr.size();i++){

            curr=get_nxt(curr,qr[i-1]-'a');

            int pom=curr;
            while(pom!=root){
                rdp[i]=min(rdp[i],rdp[ i-len[pom]]+val[pom]);
                pom=get_link(pom);
            }

        }

        if(e){
            printf("%d %d PBPB\n",pb[0],pb[1]);
        }

        if(rdp[qr.size()]>=inf)printf("-1\n");
        else printf("%lld\n",rdp[qr.size()]);

        e=0;

    }

    return 0;
}

详细

Test #1:

score: 100
Accepted
time: 20ms
memory: 207828kb

input:

2
2 3
defgh
abc
abcde
1 1
a
b

output:

3
-1

result:

ok 2 number(s): "3 -1"

Test #2:

score: 0
Accepted
time: 148ms
memory: 216672kb

input:

1
1413 4867
yumnkkghwtqnhpmmsbfwypcwudihegsvtdaykueuqozagpgdnhbwzoqrqswyctzonwmjdjmmpyzbyihhpyznmqltcuckqmcybbdafoexqztxhzlfjowznisnxtgoiqjztogldyegajmegalqgawrzotuntocmsagvkzdnwhmaewuxiuhvintpzwyrkgapnmegpveyuuorrfvrfakjyetfaoqtvwghlslsvmahrkvzkwpaviufknrpuapicqdnn
yumnkkghwtqnhpmmsbfwypcwudihegsvt...

output:

10

result:

ok 1 number(s): "10"

Test #3:

score: 0
Accepted
time: 363ms
memory: 211056kb

input:

10
446 4905
afigcjhcgagabbiccehjcjajigghgbjjadccicghggijjdfeciaccgheedjdhgfjdfdbgidbbdjaiehhceeehchhabhaideggjbjajgfgicfdggahhbjgdebccbgbiedhehaebdccdfdffaacjcfbgjeegbahhbgcdjigijajheidchbddicehhhjbeiaajgedhdcjiefdgdbjjfaegheeidieheecaicciaajbabiidcecefgiicccdidegeica
afigcjhcgagabbiccehjcjajigghgbj...

output:

3
2
2
11
6
5
1
1
1
1

result:

ok 10 numbers

Test #4:

score: 0
Accepted
time: 975ms
memory: 208056kb

input:

100
140 4879
baabaababbababbaabababaaababbbabbbbbbabbababbbabbbbabbbbbbaabbbbbbbbabaabbbaabaabbbaabbabaabaabbbabbbababbbaabbabaaaaabbaaabbbabb
baa
baabaababbababbaabababaaababbbabbbbbbabbab
baabaababbababbaabababaaabab
baabaababbababbaabababaaababbbabbb
baabaababbababbaabababaaababbbabbbbbbabbababbb...

output:

1
1
1
1
3
1
1
1
1
1
1
3
2
1
1
1
2
1
1
2
1
1
1
1
1
1
1
1
1
4
3
2
1
2
1
1
1
1
1
2
1
1
1
3
1
1
1
2
1
1
1
2
3
1
1
1
2
1
1
1
1
1
1
1
1
3
2
3
1
3
1
1
2
1
2
3
2
1
1
1
3
2
1
2
1
1
1
1
1
1
1
1
1
1
1
1
2
1
4
1

result:

ok 100 numbers

Test #5:

score: 0
Accepted
time: 94ms
memory: 232112kb

input:

1
7 4864
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...

output:

205

result:

ok 1 number(s): "205"

Test #6:

score: -100
Wrong Answer
time: 131ms
memory: 220792kb

input:

10
7 4923
baaabbabbbabbbbbabaabaabababbabbaaaabbaaabbbbabbaaababaaaaabaaabbabbbabbaaaabbaabbbaabbaaababaaababbabaababbaababbabaaabaabbaaabaaaababbabbabaabaabaabaabbbbaabaabbbaababbabbabaaaabbbaabbbaaaabaaaaababbaabaaaaababbbbaaaabbbaababbaabbabaabaaaaababaababaabaaaaabababababbabbbabababaaabaababbaa...

output:

2000000000000000009 b COST
2000000000000000022 a COST
2000000000000000003 a COST
2000000000000000003 b COST
2000000000000000010 b COST
2000000000000000011 a COST
2000000000000000003 b COST
1 1 PBPB
-1
243
-1
549
131
779
-1
769
336
352

result:

wrong answer 1st numbers differ - expected: '4287', found: '2000000000000000009'