QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#876519 | #9970. Looping RPS | Matutino | WA | 6ms | 78784kb | C++17 | 2.8kb | 2025-01-30 22:55:04 | 2025-01-30 22:55:05 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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'