{"id":474,"date":"2022-06-13T19:06:34","date_gmt":"2022-06-13T22:06:34","guid":{"rendered":"http:\/\/www.galirows.com.br\/meublog\/competir\/?page_id=474"},"modified":"2022-06-13T19:08:01","modified_gmt":"2022-06-13T22:08:01","slug":"shortcodes","status":"publish","type":"page","link":"http:\/\/www.galirows.com.br\/meublog\/competir\/dicas\/otimizacoes-para-o-codigo\/shortcodes\/","title":{"rendered":"Shortcodes"},"content":{"rendered":"\n<p id=\"yui_3_17_2_1_1655153766823_28\">Existem alguns encurtamentos (<em>shortcode<\/em>) que se pode especificar para facilitar a escrita dos algoritmos. Na programa\u00e7\u00e3o competitiva e necess\u00e1rio escrever os c\u00f3digos o mais r\u00e1pido poss\u00edvel e esses encurtamentos economizam algum tempo. A utiliza\u00e7\u00e3o desse tipo de otimiza\u00e7\u00e3o \u00e9 v\u00e1lida quando a equipe j\u00e1 est\u00e1 com um bom desempenho na resolu\u00e7\u00e3o de problemas, ent\u00e3o inicialmente \u00e9 importante se focar em resolver problemas e depois em conseguir fazer a codifica\u00e7\u00e3o deles o mais r\u00e1pido poss\u00edvel. Eles envolvem a especifica\u00e7\u00e3o de <em>typedefs <\/em>e macros para as opera\u00e7\u00f5es mais comuns.<\/p>\n\n\n\n<p><strong>Typedef<\/strong><\/p>\n\n\n\n<p>Um dos usos mais comuns de encurtamento \u00e9 com a utiliza\u00e7\u00e3o do comando <em><strong>typedef<\/strong><\/em>. Com esse comando \u00e9 poss\u00edvel encurtar o nome de um tipo de dado. Por exemplo, para encurtar a defini\u00e7\u00e3o dos dados do tipo <em>long long<\/em>, \u00e9 poss\u00edvel utilizar a instru\u00e7\u00e3o:<em> typedef long long LL;<\/em><\/p>\n\n\n\n<p>Com esse <em>typedef<\/em>, a declara\u00e7\u00e3o<em> long long x;<\/em> pode ser encurtada para <em>LL x;<\/em><\/p>\n\n\n\n<p>O ganho na quantidade de caracteres utilizados para escrever o c\u00f3digo pode ser significativo para equipes bastante competitivas e que essa velocidade maior \u00e9 importante. Cada equipe elabora seus pr\u00f3prios <em>shortcodes<\/em> e conforme sua necessidade, mas \u00e9 importante que todos estejam acostumados com eles e as particularidades utilizadas pela equipe para definir os <em>shortcodes<\/em>. <\/p>\n\n\n\n<p><strong>Macros<\/strong><br>As macros s\u00e3o trechos que ser\u00e3o substitu\u00eddos antes da compila\u00e7\u00e3o do c\u00f3digo e s\u00e3o especificadas utilizando a instru\u00e7\u00e3o <em>#define<\/em>.<\/p>\n\n\n\n<p>Algumas macros podem ser bastante simples, como por exemplo o encurtamento para fun\u00e7\u00e3o <em>push_back()<\/em> da biblioteca <em>vector<\/em>. Utilizando <em>#define PB push_back<\/em>, \u00e9 poss\u00edvel chamar essa fun\u00e7\u00e3o no c\u00f3digo escrevendo somente <em>PB()<\/em>. O c\u00f3digo abaixo ilustra como utilizar essa macro.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;iostream&gt;\n#include &lt;vector&gt;\nusing namespace std;\n\nint main(){\n   vector&lt;int&gt; myvector{ 1, 2, 3};\n   myvector.push_back(9);\n   for (int i=0; i&lt;=3; i++) {\n      printf(\"%i \", myvector[i]);\n   }\n}<\/code><\/pre>\n\n\n\n<p>Na linha 4 foi definida a macro e na linha 8 ela j\u00e1 foi utilizada para adicionar um valor ao vetor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;iostream&gt;\n#include &lt;vector&gt;\nusing namespace std;\n#define PB push_back\n\nint main(){\n   vector&lt;int&gt; myvector{ 1, 2, 3};\n   myvector.PB(9);\n   for (int i=0; i&lt;=3; i++) {\n      printf(\"%i \", myvector[i]);\n   }\n}<\/code><\/pre>\n\n\n\n<p>A macro tamb\u00e9m pode ser utilizada para encurtar estruturas de dados, como \u00e9 o caso do uso associado com o comando <em>for<\/em>. Com esse encurtamento ser\u00e1 sempre mais f\u00e1cil\/r\u00e1pido escrever as instru\u00e7\u00f5es <em>for<\/em> e como seu uso \u00e9 bastante comum na codifica\u00e7\u00e3o, sua economia de tempo \u00e9 signitificativa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">int main(void) {\n    int t;\n    for (int i=2; i&lt;=30; i++) {\n        printf(\"%i \", i);\n    }\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c\">#define REP(i, a, b) for (int i=a; i&lt;=b; i++)\n\nint main(void) {\n    int t;\n    REP(i,2,30) {\n        printf(\"%i \", i);\n    }\n\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Veja que pode parecer um gasto de tempo escrever os <em>shortcodes <\/em>que trazem ganhos t\u00e3o pequenos, mas em uma equipe um integrante come\u00e7a escrevendo os <em>shortcodes <\/em>enquanto que os demais se debru\u00e7am lendo os problemas e identificando por qual come\u00e7ar.<\/p>\n\n\n\n<p>Abaixo segue um template de <em>shortcodes <\/em>bastante comum e \u00fatil. Ele foi retirado de <a rel=\"noreferrer noopener\" href=\"https:\/\/www.geeksforgeeks.org\/c-methods-of-code-shortening-in-competitive-programming\/\" target=\"_blank\">https:\/\/www.geeksforgeeks.org\/c-methods-of-code-shortening-in-competitive-programming\/<\/a><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"cpp\" class=\"language-cpp\">#include &lt;bits\/stdc++.h&gt; \/\/ Include every standard library\nusing namespace std;\n\ntypedef long long LL;\ntypedef pair&lt;int, int&gt; pii;\ntypedef pair&lt;LL, LL&gt; pll;\ntypedef pair&lt;string, string&gt; pss;\ntypedef vector&lt;int&gt; vi;\ntypedef vector&lt;vi&gt; vvi;\ntypedef vector&lt;pii&gt; vii;\ntypedef vector&lt;LL&gt; vl;\ntypedef vector&lt;vl&gt; vvl;\n\ndouble EPS = 1e-9;\nint INF = 1000000005;\nlong long INFF = 1000000000000000005LL;\ndouble PI = acos(-1);\nint dirx[8] = { -1, 0, 0, 1, -1, -1, 1, 1 };\nint diry[8] = { 0, 1, -1, 0, -1, 1, -1, 1 };\n\n#ifdef TESTING\n#define DEBUG fprintf(stderr, \"====TESTING====\\n\")\n#define VALUE(x) cerr &lt;&lt; \"The value of \" &lt;&lt; #x &lt;&lt; \" is \" &lt;&lt; x &lt;&lt; endl\n#define debug(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG\n#define VALUE(x)\n#define debug(...)\n#endif\n\n#define FOR(a, b, c) for (int(a) = (b); (a) &lt; (c); ++(a))\n#define FORN(a, b, c) for (int(a) = (b); (a) &lt;= (c); ++(a))\n#define FORD(a, b, c) for (int(a) = (b); (a) &gt;= (c); --(a))\n#define FORSQ(a, b, c) for (int(a) = (b); (a) * (a) &lt;= (c); ++(a))\n#define FORC(a, b, c) for (char(a) = (b); (a) &lt;= (c); ++(a))\n#define FOREACH(a, b) for (auto&amp;(a) : (b))\n#define REP(i, n) FOR(i, 0, n)\n#define REPN(i, n) FORN(i, 1, n)\n#define MAX(a, b) a = max(a, b)\n#define MIN(a, b) a = min(a, b)\n#define SQR(x) ((LL)(x) * (x))\n#define RESET(a, b) memset(a, b, sizeof(a))\n#define fi first\n#define se second\n#define mp make_pair\n#define pb push_back\n#define ALL(v) v.begin(), v.end()\n#define ALLA(arr, sz) arr, arr + sz\n#define SIZE(v) (int)v.size()\n#define SORT(v) sort(ALL(v))\n#define REVERSE(v) reverse(ALL(v))\n#define SORTA(arr, sz) sort(ALLA(arr, sz))\n#define REVERSEA(arr, sz) reverse(ALLA(arr, sz))\n#define PERMUTE next_permutation\n#define TC(t) while (t--)\n\ninline string IntToString(LL a)\n{\n\tchar x[100];\n\tsprintf(x, \"%lld\", a);\n\tstring s = x;\n\treturn s;\n}\n\ninline LL StringToInt(string a)\n{\n\tchar x[100];\n\tLL res;\n\tstrcpy(x, a.c_str());\n\tsscanf(x, \"%lld\", &amp;res);\n\treturn res;\n}\n\ninline string GetString(void)\n{\n\tchar x[1000005];\n\tscanf(\"%s\", x);\n\tstring s = x;\n\treturn s;\n}\n\ninline string uppercase(string s)\n{\n\tint n = SIZE(s);\n\tREP(i, n)\n\tif (s[i] &gt;= 'a' &amp;&amp; s[i] &lt;= 'z')\n\t\ts[i] = s[i] - 'a' + 'A';\n\treturn s;\n}\n\ninline string lowercase(string s)\n{\n\tint n = SIZE(s);\n\tREP(i, n)\n\tif (s[i] &gt;= 'A' &amp;&amp; s[i] &lt;= 'Z')\n\t\ts[i] = s[i] - 'A' + 'a';\n\treturn s;\n}\n\ninline void OPEN(string s)\n{\n#ifndef TESTING\n\tfreopen((s + \".in\").c_str(), \"r\", stdin);\n\tfreopen((s + \".out\").c_str(), \"w\", stdout);\n#endif\n}\n\n\/\/ end of Sektor_jr template v2.0.3 (BETA)\n\nint main()\n{\n\tfreopen(\"A.in\", \"r\", stdin);\n\tfreopen(\"output.txt\", \"w\", stdout);\n\n\tint a, b;\n\tfin &gt;&gt; a &gt;&gt; b;\n\tfout &lt;&lt; a + b &lt;&lt; endl;\n\treturn 0;\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Existem alguns encurtamentos (shortcode) que se pode especificar para facilitar a escrita dos algoritmos. Na programa\u00e7\u00e3o competitiva e necess\u00e1rio escrever os c\u00f3digos o mais r\u00e1pido poss\u00edvel e esses encurtamentos economizam algum tempo. A utiliza\u00e7\u00e3o desse tipo de otimiza\u00e7\u00e3o \u00e9 v\u00e1lida quando a equipe j\u00e1 est\u00e1 com um bom desempenho na resolu\u00e7\u00e3o de problemas, ent\u00e3o inicialmente [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":460,"menu_order":10,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-474","page","type-page","status-publish","hentry"],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/474","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/comments?post=474"}],"version-history":[{"count":7,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/474\/revisions"}],"predecessor-version":[{"id":481,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/474\/revisions\/481"}],"up":[{"embeddable":true,"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/pages\/460"}],"wp:attachment":[{"href":"http:\/\/www.galirows.com.br\/meublog\/competir\/wp-json\/wp\/v2\/media?parent=474"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}