Please subscribe to the official Codeforces channel in Telegram via the link https://t.me/codeforces_official. ×

defnotmee's blog

By defnotmee, 3 hours ago, In English

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 it was just a big cheating group.

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) to while(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 into cln1 and cln2 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!

  • Vote: I like it
  • +85
  • Vote: I do not like it

»
2 hours ago, # |
  Vote: I like it +1 Vote: I do not like it

Auto comment: topic has been updated by defnotmee (previous revision, new revision, compare).

  • »
    »
    101 minute(s) ago, # ^ |
      Vote: I like it 0 Vote: I do not like it

    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!

»
2 hours ago, # |
  Vote: I like it 0 Vote: I do not like it

Is there any way to find him other than manually? codeforces needs to update its plagiarism checking system.

  • »
    »
    118 minutes ago, # ^ |
      Vote: I like it +1 Vote: I do not like it

    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.

    • »
      »
      »
      107 minutes ago, # ^ |
        Vote: I like it 0 Vote: I do not like it

      Do you have any point what EndlessDreams is doing? He didn't farming rating, but he is helping cheating. Sounds weird for me.

      • »
        »
        »
        »
        96 minutes ago, # ^ |
          Vote: I like it +1 Vote: I do not like it

        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.

»
112 minutes ago, # |
Rev. 2   Vote: I like it 0 Vote: I do not like it

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.

»
63 minutes ago, # |
  Vote: I like it 0 Vote: I do not like it

Well I am new to codeforces so didn't quite get how having alternate accounts help them cheat. Can someone explain?

  • »
    »
    47 minutes ago, # ^ |
      Vote: I like it +3 Vote: I do not like it

    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.

»
30 minutes ago, # |
  Vote: I like it +2 Vote: I do not like it

blud tried to cook the contest, but at the end he got cooked himself

»
28 minutes ago, # |
  Vote: I like it 0 Vote: I do not like it

Great one