Hello codeforces! You guys must have seen the recent blog accusing international master Psychotic_D of cheating in the most recent div2 round: Codeforces Round 960 (Div. 2). This is due to the fact that the author, wuhudsm is Psychotic_D's friend and that Psychotic_D had a ridiculous performance, winning the amongst official participants.
They are both big members of TheForces, raising suspicions of whether there was some collusions between the two.
At first i thought it was nonsense since the evidence was lacking, but after a bit of my own investigation I've compiled the most interesting pieces of evidence of why i believe Psychotic_D (along with some accomplices from TheForces) is in fact a cheater.
Case #1: Introduction
I first learned about the subject on herav_singhhh's blog. The blog is overall low quality and goes on too long on things that dont matter when catching a cheater. As an example, I will show a submission pair that does not strike me as suspicious that was in the blog (seeing this will help us see what is important on determining if someone is cheating): 192289785 and 192291152
A few things you can observe in this:
- The general logic of both codes is basically the same
- The code on the right uses maps and the code on the left uses arrays
- They handle cleaning the input differently
- The codes are very short
While they are suspicious, it is very hard to accuse someone of cheating on problems that are really simple to code. It is easy for multiple people to have a similar logic on problems like this, and it is expected that people will have similar ways of doing things. Moreover, I couldn't link Synergism's account to Psychotic_D (even though the former is obviously an alt). The fact that the submissions are so close in time and are so similar is suspicious, but not enough to ban someone. For us to have a conclusive veredict we would need a code that is:
- Reasonably long
- Has multiple copypasted elements
- Does things in an different enough way that the only explanation that they are so similar is that the code was shared.
And herav_singhhh provides with a submission pair that meets the criteria.
Case #2: A new take on cheating
Take a look at this submission pair that was also in the blog: 222750300 222766998
At first glance these submissions seem reasonably different. That's because Psychotic_D is a reasonably smart cheater. Most cheaters will take the path that takes the least effort, and because of that they are very easily caught. Check this diagram
Psychotic_D has some knowledge of how code works and tries to achieve the same result in an inderect way. Note how the two pieces of code have the exact same logic, but he shift things around if they dont necessarily require each other to work. On the previous case, he also swapped an array for a map, knowing that it would just make the code a bit slower.
However, he doesn't necessarily know why the solutions he is copying work. One particular, there is this $$$50 \times 50$$$ table that is calculated every call of solve. If you check any other submission of this problem, you will see that only a $$$30 \times 30$$$ table is calculated (maybe $$$32 \times 32$$$). I picked around 10 random submissions and none of them had that specific number. This is because the elements are at most 30 bits long. The original person who solved the problem probably wanted some extra space in case anything went wrong, but it is certainly unusual. Psychotic_D was probably too scared of causing some type of issue by changing that constant, not knowing why it was there, and just copied it.
EDIT: It came to my attention that Psychotic_D actually tried to change the constant! Look at this submission: 222765150. He tries making the table $$$100 \times 100$$$ but it passes the limits for long long, resulting in a wrong answer. That was really funny to me.
There are also multiple places where random solutions differ from this general logic:
- Using a flag to compute if it.second is 0 instead of instantly returning
- Calculating the table outside of the solve function and reusing it for all cases
- Using an array instead of a map to calculate the frequencies
In addition, they aren't strangers, they know each other.
This is a screenshot coming from Psychotic_D, showing he had access to the account of EndlessDreams. EndlessDreams is also a prominent member on the TheForces group, where Psychotic_D is a manager. There are too many coincidences for this to be a misunderstanding.
However, one thing is lacking. The original claim was that Psychotic_D cheated on his friend's round, and so far it just shows that he most likely cheated in the past. We would need an equally suspicious code that confirms that he also cheated on that round. But where would he cheat from if he was the best between official participants?
Case #3: Catching the Mole
wuhudsm's round had an interesting problem: Catch the Mole. It was an interactive problem that where it really hard to create cases that break all heuristics. That way, a lot of codes that shouldn't pass, did. One of these codes is Psychotic_D's, where he just tried to query a vertex close to the centroid of the tree multiple times, removing the leaves in each iteration: 271612487. At first I thought he might've cheated on ABCD but did E legitimately, given that he did a scam solution after 1 hour of thinking. That would also explain why he got top 1, even though that clearly draws a lot of attention from him. Well, that was until i checked the submissions for E1.
Check this blue that did E almost as fast as tourist! What a prodigy! Let's see how he did in the round.
Huh, why would he submit E so fast and then leave the round? Well, it is clear after we compare his code to Psychotic_D's:
Here is the pair of submissions for you guys to check: 271612487, 271575642
This time it is so big that i needed to divide each code into two parts. Note how similar it is to the other cases:
- Copied submission uses "Delta" instead of "solve"
- Making changes in places that cant affect the code: putting stuff in functions, changing variable names, changing
while(true)
towhile(1)
, etc. Anything that an intermediate coder would see that could be changed was changed. - Weird manneirisms in the code stay the same. For example, both use the same check to find a vertex close to the centroid: checking the value of
abs(sum[i] - sum[1] / 2)
. - Refactoring of functions to achieve the same goal. Look how he breaks apart
dfs2
intocln1
andcln2
to do exactly the same thing in a more roundabout way.
Also note that hololgram-sakura's description is also in chinese, like EndlessDreams. Also $$$^2$$$ note that Psychotic_D has a TLE submission on this problem for forgetting to put the code that clears the array somewhere, choosing to put it in a really weird spot in the end: 271611264.
It is pretty clear to me that hololgram-sakura is an alt of EndlessDreams and they have been cheating on many contests together, probably doing them in a team like other high rated cheaters did in the past. By those 3 accounts you can see how the methods of cheating from Psychotic_D evolved through the years, going from minor alterations on easy problems to major refactors in hard problems.
In addition, [REDACTED] helped me by finding more suspicious submission pairs: (269238719,269257401) and (269250817, 269264255). They follow most of the trademarks that happened on previous submissions.
Conclusion
It is always disheartening to see high level competitors cheating. As someone who loves competitive programming it is sad to see so many people that had potential to be great fall for such tactics. I plead other participants to be more honest in the future, what use is there in getting more rating if you know you didn't deserve it? Doing bad in some rounds is normal and you shouldn't try cheating to remedy it.
Anyways, take care!
Also MikeMirzayanov please ban him!
EDIT: A lot of stuff happened and now this blog now has a part 2, check here.
Auto comment: topic has been updated by defnotmee (previous revision, new revision, compare).
The earlier blogs were too chaotic. I thank you for collecting evidences in a more organized way. You (and everyone who helped) did this on your own. Hats off to you guys! Much respect and love to you!
I've always wanted to know why most people who catch cheaters seem to write blogs that are barely coherent, disorganized messes.
I think it's just to attract attention. The previous two blogs had sprinkled in additional personal information, which was enough to keep people commenting about that information due to some parties feeling offended.
They must've thought that it must be hard to not notice a blog getting hundreds of comments, even if those comments are irrelevant to the actual cheating evidence and more about the cheater's background.
hey, would you mind telling me how to see the perfomance rating in a particular contest like in the picture you have attached?
Carrot Extension
Is there any way to find him other than manually? codeforces needs to update its plagiarism checking system.
Maybe there is but they do a good job of avoiding automatic detection. The plagiarized codes work differently, even if they do the same thing in the end. I am not that knowledgeable about alternative options to detect plagiarism.
Do you have any point what EndlessDreams is doing? He didn't farming rating, but he is helping cheating. Sounds weird for me.
I think he was just his friend and Psychotic_D asked him for help. Maybe it was something where if Psychotic_D failed a problem, EndlessDreams would give him solutions.
The two most recent rounds he participated were also unrated for EndlessDreams, so he had no problem hopping on an alt to help him.
If you are skilled enough (expert or above, maybe even specialist) then even if someone shares some crucial observations for a problem then in lot of cases it shouldn't be too hard to come up with solution and AC eventually for problems upto Div2D. And you will never be able to catch them.
This is why its in best interest to just enjoy solving problems and compete for the sake of it. If you have trusted CP friends then you can compete among yourselves for topping the friends standings.
It does get harder to do that, but yes. That's why this type of cheating extends to lgms: https://codeforces.me/blog/entry/129181
Well I am new to codeforces so didn't quite get how having alternate accounts help them cheat. Can someone explain?
First of all, having alternate accounts is against the rules. Second, my claim is that Psychotic_D and EndlessDreams are two different people sharing codes. That is even more agains the rules.
blud tried to cook the contest, but at the end he got cooked himself
Great one
It's sad to hear that some of the big members in this gruop is related to cheating, and I know the reason that you're doubting that TheForces is a big cheating group, but currently no evidence is given about TheForces being a big cheating group, and this may harm some honest contestants, so I kindly ask you to remove statements like this.
I honestly havent heard of TheForces before this situation and I wanted to say which accusations were thrown around.
I can remove the extra comment. However I think it is important to at least mention TheForces since the author of the round in question, Psychotic_D and EndlessDreams are from there. They aren't random members either, Psychotic_D has manager permissions and the first thing you see when you enter the group is a post from EndlessDreams.
yeah, I know what you want to emphasize, but you've mentioned it later in the same blog(the last two paragraphs in case #2), so it seems like you're additionally accusing of TheForces being a big cheating group instead of emphasizing that they're in the same gruop in the statement.
I've changed "whether it was a big cheating group" to "whether there was collusion between the two". I left the part that i believe that there are some number of accomplices from TheForces.
It's much better now, thanks.
Bro really tried to play 4d chess but ended up getting mated himself.
Better to be a specialist than this.I cheated in one of my earlier contests 2 years back, glad didn't follow that path!!
Ironic problem name to get caught cheating on lmao
It makes me think of Teacher Ka (Karry5307) in HNOI.