Блог пользователя roman28

Автор roman28, 9 лет назад, По-английски

Look at the following two codes Accepted Wrong Anwer

the only difference in the above two codes is that accepted code has the declaration char c[105][105] while the wrong answer code has the declaration char c[n][m]. Can someone explain me the reason behind why second one is wrong?

  • Проголосовать: нравится
  • +8
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Its weird for the same test case your code gives correct ans on Ideone. See this link : http://ideone.com/wAtjBk I tried submitting it on CF, got WA on 15th test case for which again your code is giving correct result. Really weird stuff. o.O

»
9 лет назад, # |
  Проголосовать: нравится +9 Проголосовать: не нравится

You don't initialize all entries of your array (specifically, entries with i%2 == 1, j > 0 and j < m-1 are left uninitialized). This doesn't hurt your algorithm unless a random uninitialized value of one of those entries is '#'. It so happened that this is the case for one of your solutions but not for the other one.

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    How is declaring char c[n][m] and char c[105][105] different in terms of initialization?

    I guess both are used as uninitialized, it is just the dynamic size and the constant size that is affecting the output. Correct me if I am wrong.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +1 Проголосовать: не нравится

      Well it may have some influence, but it's an implementation detail anyway and probably depends on the compiler and how it optimized the code. I've just tested it by declaring two uninitialized arrays of the same size (one constant length, another variable length). Both had non-zero (uninitialized) entries.

  • »
    »
    9 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

    Have a look at this. here i have declared char c[n+50][m+50] and it acceped. I dont have a clue why. have a look at this. here i have declared char c[60][60] while the maximum input could only be of size 50, still it is giving WA and if i declare char c[65][65], it is accepted. why?

    I am asking all this, so that i don't fall into this trap during one of the live contests.

»
9 лет назад, # |
  Проголосовать: нравится +3 Проголосовать: не нравится

Size of your array must be bigger than n,m. Don't actually know why, but I guess you trying to access to place in your array that does not exist. (When I use arrays I make maximal size for them, in order to don't have any trouble with them. Sorry for bad english, correct me if I am wrong)

  • »
    »
    9 лет назад, # ^ |
      Проголосовать: нравится +3 Проголосовать: не нравится

    Have a look at this Wrong Answer

    here if have declared char c[n+5][m+5], but the solution is still wrong.

    • »
      »
      »
      9 лет назад, # ^ |
        Проголосовать: нравится +3 Проголосовать: не нравится

      maximal size (c[1000][1000]) or try c[n+50][m+50], works

      • »
        »
        »
        »
        9 лет назад, # ^ |
          Проголосовать: нравится +3 Проголосовать: не нравится

        Yeah it does!! But what is the reason? If i see such solution during the live contest, can i design a test case to hack it?

        • »
          »
          »
          »
          »
          9 лет назад, # ^ |
          Rev. 3   Проголосовать: нравится +8 Проголосовать: не нравится

          Well, I think it's very hard, because you don't know what Codeforces computers are like. My teacher has told us that we shouldn't declare arrays like that or something unexpected may happen. If you really want to do so, you can just do this:

          vector<vector<char> > c(n);
          for(int i=0;i<n;i++)c[i].resize(m);
          

          or

          const int maxn=105,maxm=105;
          char c[maxn][maxm];
          
          • »
            »
            »
            »
            »
            »
            9 лет назад, # ^ |
              Проголосовать: нравится +1 Проголосовать: не нравится

            In the second option the array will be also uninitialized, unless it's a global variable.

      • »
        »
        »
        »
        9 лет назад, # ^ |
        Rev. 3   Проголосовать: нравится 0 Проголосовать: не нравится

        OH!!!!!!!!!!!! come on man ! Extra spaces isn't solution for this problem .

        As slycelote said , this problem is because of uninitialized array.

        It is very simple , when you don't initialize array , random values filled the array. So imagine I want to create an uninitialized array with 5 items and then fill odd positions with '#'. then I do that with what roman28 did in his code for fill and print array .

        Sample uninitialized array :           0Fu^9
        
        -> Fill odd positions :                #F#^#
        
        -> Print it (s[i]=='#' ? '#' : '.') -> #.#.#
        
        ---------------------------------------------------
        
        Another Sample ->                      9#oQp
        
        -> Fill odd positions :                ###Q#
        
        -> Print it (s[i]=='#' ? '#' : '.') -> ###.#
        

        I think this samples are clear enough .