QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876519#9970. Looping RPSMatutinoWA 6ms78784kbC++172.8kb2025-01-30 22:55:042025-01-30 22:55:05

Judging History

This is the latest submission verdict.

  • [2025-01-30 22:55:05]
  • Judged
  • Verdict: WA
  • Time: 6ms
  • Memory: 78784kb
  • [2025-01-30 22:55:04]
  • Submitted

answer

#include<bits/stdc++.h>
#define reg register
#define int long long
inline int read(){
    reg int x=0,k=1; reg char ch=getchar();
    while (ch<'0'||ch>'9') (ch=='-')&&(k=-1),ch=getchar();
    while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*k;
}
const int N=1e6+10,mod=998244353,bs=13;
inline int qpow(reg int a,reg int b=mod-2){
    reg int res=1;
    for (;b;b>>=1,a=a*a%mod) if (b&1) res=res*a%mod; return res;
}
int n,idx,ys[300],inv[N],pos[N],qwq[N],ans[N],id[N];
int ch[N][4],cnt[N],pw[N],sz[N],draw[N],qwq2[N];
std::string str[N];
std::vector<int> hsh[N];
inline int calc(reg int id,reg int L){
    reg int len=str[id].size();
    reg int p=(qpow(pw[len],(L-1)/len)-1)*inv[len]%mod;
    p=p*hsh[id][len-1]%mod;
    p=(p*pw[(L-1)%len+1]+hsh[id][(L-1)%len])%mod;
    return p;
}
signed main(){
    n=read();
    ys['K']=1,ys['P']=2,ys['N']=3;
    for (reg int i=1;i<=n;i++){
        std::cin>>str[i];
        reg int x=0,len=str[i].size(); 
        hsh[i].resize(len),pw[0]=1; 
        for (reg int i=1;i<=len;i++) pw[i]=1ll*pw[i-1]*bs%mod,inv[i]=qpow(pw[i]-1);
        for (reg int j=0,c;j<str[i].size()&&(c=str[i][j]);j++){
            if (!ch[x][ys[c]]) ch[x][ys[c]]=++idx;
            x=ch[x][ys[c]],sz[x]++;
            hsh[i][j]=((j?hsh[i][j-1]:0)*bs+ys[c])%mod;
        }
        cnt[x]++,id[x]=i,pos[i]=x;
    }
    // std::cerr<<"hsh\n"<<calc(1,1)<<"\n"<<calc(2,1)<<"\n";
    for (reg int i=1;i<=n;i++){
        reg int x=0;
        for (reg int j=0,c;j<str[i].size()&&(c=str[i][j]);j++){
            if (c=='K') ans[i]+=sz[ch[x][3]];
            if (c=='P') ans[i]+=sz[ch[x][1]];
            if (c=='N') ans[i]+=sz[ch[x][2]];           
            x=ch[x][ys[c]];
            if (cnt[x]){
                reg int l=1,r=str[i].size()*(j+1),lcp=0;
                while (l<=r){
                    reg int mid=l+r>>1;
                    if (calc(i,mid)==calc(id[x],mid)) lcp=mid,l=mid+1;
                    else r=mid-1;
                }
                lcp++;
                // std::cerr<<"<< "<<i<<" "<<id[x]<<" "<<lcp-1<<"\n";
                reg char c1=str[i][(lcp-1)%str[i].size()],c2=str[id[x]][(lcp-1)%str[id[x]].size()];
                if (c1=='K'&&c2=='N'||c1=='P'&&c2=='K'||c1=='N'&&c2=='P') ans[i]+=cnt[x];
                else if (c2=='K'&&c1=='N'||c2=='P'&&c1=='K'||c2=='N'&&c1=='P') qwq[x]++;
                else draw[i]+=cnt[x],qwq2[x]+=x!=pos[i];
            }
        }
    }
    for (reg int i=1;i<=n;i++) ans[i]+=qwq[pos[i]],draw[i]+=qwq2[pos[i]];
    reg int Ans=n*(n-1)*(n-2)/6;
    for (reg int i=1;i<=n;i++) Ans-=ans[i]*(ans[i]-1)>>1;//std::cerr<<draw[i]<<"\n";
    for (reg int i=1;i<=n;i++) Ans-=draw[i]*(draw[i]-1)>>1;
    for (reg int i=1;i<=n;i++) Ans+=draw[i]*(draw[i]-1)*(draw[i]-2)/3;
    printf("%lld\n",Ans);
    return 0;
}  

详细

Test #1:

score: 100
Accepted
time: 4ms
memory: 78784kb

input:

6
P
PN
KK
N
PKK
PN

output:

6

result:

ok 1 number(s): "6"

Test #2:

score: 0
Accepted
time: 5ms
memory: 78008kb

input:

10
KKKNP
KNKPPKNK
KNKPP
KNKPPKN
KKKN
NNKNNNKNNNKNNNKNNNKNNNKNNNKNNPN
NNKN
NPPN
NNKNNNKNNNKNNNKNNNKNNNKNNNK
KKKNN

output:

3

result:

ok 1 number(s): "3"

Test #3:

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

input:

10
NNNPNNNPNNNPNNNK
KKN
NNNP
KKP
NNNPNNNPNNNPN
KKNKKNKKPN
KNNPNPNKKKNPPKNKKKNKNKKNKPPPNKKPKP
KKPK
KKNKKNK
KKPKKN

output:

3

result:

ok 1 number(s): "3"

Test #4:

score: -100
Wrong Answer
time: 6ms
memory: 78368kb

input:

10
K
PPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNP
PPKP
PPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPK
P
K
N
P
PPPNN
N

output:

30

result:

wrong answer 1st numbers differ - expected: '25', found: '30'