QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#876567 | #9970. Looping RPS | Matutino | WA | 10ms | 83044kb | C++17 | 3.2kb | 2025-01-31 00:08:59 | 2025-01-31 00:08:59 |
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],fa[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;
}
int find(reg int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
inline void merge(reg int x,reg int y){
x=find(x),y=find(y);
if (x^y) fa[y]=x,Sz[x]+=Sz[y];
}
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<=idx;i++) fa[i]=i,Sz[i]=cnt[i];
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],merge(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,ans2=0;
for (reg int i=1;i<=n;i++) ans2+=ans[i]*(ans[i]-1)>>1,ans2+=(n-ans[i]-draw[i])*(n-ans[i]-draw[i]-1)>>1;
for (reg int i=1;i<=idx;i++) if (find(i)==i&&Sz[i])
ans2+=Sz[i]*(Sz[i]-1)*(Sz[i]-2)/3,ans2+=Sz[i]*(Sz[i-1])/2*(n-Sz[i]);
// for (reg int i=1;i<=n;i++) Ans-=,std::cerr<<draw[i]<<"\n";
// for (reg int i=1;i<=n;i++) ans2+=draw[i]*(n-2);
// std::cerr<<"<< "<<ans2/2<<"\n";s
printf("%lld\n",Ans-ans2/2);
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 7ms
memory: 82784kb
input:
6 P PN KK N PKK PN
output:
6
result:
ok 1 number(s): "6"
Test #2:
score: 0
Accepted
time: 9ms
memory: 81668kb
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: 8ms
memory: 82060kb
input:
10 NNNPNNNPNNNPNNNK KKN NNNP KKP NNNPNNNPNNNPN KKNKKNKKPN KNNPNPNKKKNPPKNKKKNKNKKNKPPPNKKPKP KKPK KKNKKNK KKPKKN
output:
3
result:
ok 1 number(s): "3"
Test #4:
score: 0
Accepted
time: 4ms
memory: 81332kb
input:
10 K PPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNP PPKP PPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPNNPPPK P K N P PPPNN N
output:
25
result:
ok 1 number(s): "25"
Test #5:
score: 0
Accepted
time: 6ms
memory: 83000kb
input:
10 NPNKP NNNNKNNNNPP PPKPNNNNPNKKKN NPNKPNP NNNNKN NNNNK NKNPKKPNPKKNPNKN NKNPKKPNPKKNPNK NKNPKKPNPKKNP NPNKPNPN
output:
30
result:
ok 1 number(s): "30"
Test #6:
score: 0
Accepted
time: 7ms
memory: 81568kb
input:
10 KPKKPKKPKKPKKP KPKKPKKPKKPKKPKNK PNPNP KPK PN NPNPNNPNPNK NKKPKKPKPPKKPKKKKPKNKPPKPPNKNP NPNPNNP PNPNPK NPNPN
output:
39
result:
ok 1 number(s): "39"
Test #7:
score: 0
Accepted
time: 5ms
memory: 83044kb
input:
4 KKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPK NN KKP KKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKPKKNK
output:
1
result:
ok 1 number(s): "1"
Test #8:
score: 0
Accepted
time: 4ms
memory: 82380kb
input:
7 KPKN KPKNKPKNKPKNKPKK NKPPNNNPKKNN KPPKPKPPKPKPPKPKPPKPKPP KPKNKPKNKPKNKP KPPKP KPPKPKPPKPKPPKPKPPKPKPPKPN
output:
2
result:
ok 1 number(s): "2"
Test #9:
score: 0
Accepted
time: 7ms
memory: 82268kb
input:
10 NKNNKNKN KPKN PKPN PNNNNNNKKNNPNNKNPPKPPNPNPPKKKPNNNPNPKKNK PKPNPKP PKPNPK KPKNKP NKNNKNKNNKNPN KPKNKPK NKNNK
output:
39
result:
ok 1 number(s): "39"
Test #10:
score: 0
Accepted
time: 8ms
memory: 82140kb
input:
300 NKNPNK NKKNKK KPPNPN KKPNKNK PKKNPKP KPKPPPN NNKPPNN NPKPPKN KNNKKPK PPPNPKK NKPKNP KPKNNPP NNPKNP PNPPPKN PKKPNP PPNNKK PKNKNK PKNPNK NKNPNPP KNKNNPN NKPPPPK NNPPKKN KNKKNPK KKNNPKN PPPKNK NPPPPPP NKKPKPP KNKNPPK KPKPNNK NPNNKN PNPNKP PNPKKP KKKKPKN NNNKNPK NPNKPNK NNNKNK PPKKNKP NNNKPPK KPNKPP...
output:
1102940
result:
ok 1 number(s): "1102940"
Test #11:
score: 0
Accepted
time: 5ms
memory: 82364kb
input:
91 KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKN KKKKKKKKP PNPKPPNP KKKN KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKN KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKP KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKN KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKP KKKKKKKKKKKKKKKKKKKKKKN KKKKKKKN KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKP KKKKKKKKKKKKP ...
output:
2151
result:
ok 1 number(s): "2151"
Test #12:
score: -100
Wrong Answer
time: 10ms
memory: 81504kb
input:
72 PKPPKPPKPPKPPKPPN PKP NNNNNK NPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNPNNP NNPNNPNNPNNPNNPNNK NP PPPPPPN PKPPKPPKPPKPPKPP PPPPKPP PPK NNNNNPP NNNNPNNNNPNNNNPN KPNNNKKPPKPKKNPPKKNNKPKPKPKPPPKPPKPNNKPPKPPPNNNKKNNPKKKKKN...
output:
15071
result:
wrong answer 1st numbers differ - expected: '14794', found: '15071'