You are right. I learned about operating systems, but never implemented one. I learned about hasing, red-black trees, and other algorithms and data structures, but never studied them in depth in my classes. In fact, many basic algorithms and data structures (such as red-black trees) are not taught at all except in an elective course (which very few people take). In addition, I only had half a term of functional programming (and see no other courses which studies it deeply).
I really thought I was a good programmer until I started doing ICPC problems and going to competitions. Nothing really made me realize the skill difference between programmers--it was a humbling experience. Doing these problems have helped greatly however, and I am confident in implementing and describing many algorithms.