QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#876504#9970. Looping RPSMatutinoWA 6ms73804kbC++172.6kb2025-01-30 22:28:032025-01-30 22:28:04

Judging History

This is the latest submission verdict.

  • [2025-01-30 22:28:04]
  • Judged
  • Verdict: WA
  • Time: 6ms
  • Memory: 73804kb
  • [2025-01-30 22:28:03]
  • 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];
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];
                if (c2=='K'&&c1=='N'||c2=='P'&&c1=='K'||c2=='N'&&c1=='P') qwq[x]++;
            }
        }
    }
    for (reg int i=1;i<=n;i++) ans[i]+=qwq[pos[i]];//std::cerr<<ans[i]<<"\n";
    reg int Ans=n*(n-1)*(n-2)/6;
    for (reg int i=1;i<=n;i++) Ans-=ans[i]*(ans[i-1])>>1;
    printf("%lld\n",Ans);
    return 0;
}  

詳細信息

Test #1:

score: 100
Accepted
time: 5ms
memory: 73528kb

input:

6
P
PN
KK
N
PKK
PN

output:

6

result:

ok 1 number(s): "6"

Test #2:

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

input:

10
KKKNP
KNKPPKNK
KNKPP
KNKPPKN
KKKN
NNKNNNKNNNKNNNKNNNKNNNKNNNKNNPN
NNKN
NPPN
NNKNNNKNNNKNNNKNNNKNNNKNNNK
KKKNN

output:

38

result:

wrong answer 1st numbers differ - expected: '3', found: '38'