fork download
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define REP(i,a,b) for(i=a;i<b;i++)
  5. #define rep(i,n) REP(i,0,n)
  6.  
  7. #define mygc(c) (c)=getchar_unlocked()
  8. #define mypc(c) putchar_unlocked(c)
  9.  
  10. #define ll long long
  11. #define ull unsigned ll
  12.  
  13. void reader(int *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
  14. void reader(ll *x){int k,m=0;*x=0;for(;;){mygc(k);if(k=='-'){m=1;break;}if('0'<=k&&k<='9'){*x=k-'0';break;}}for(;;){mygc(k);if(k<'0'||k>'9')break;*x=(*x)*10+k-'0';}if(m)(*x)=-(*x);}
  15. void reader(double *x){scanf("%lf",x);}
  16. int reader(char c[]){int i,s=0;for(;;){mygc(i);if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF) break;}c[s++]=i;for(;;){mygc(i);if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF) break;c[s++]=i;}c[s]='\0';return s;}
  17. template <class T, class S> void reader(T *x, S *y){reader(x);reader(y);}
  18. template <class T, class S, class U> void reader(T *x, S *y, U *z){reader(x);reader(y);reader(z);}
  19. template <class T, class S, class U, class V> void reader(T *x, S *y, U *z, V *w){reader(x);reader(y);reader(z);reader(w);}
  20.  
  21. void writer(int x, char c){int s=0,m=0;char f[10];if(x<0)m=1,x=-x;while(x)f[s++]=x%10,x/=10;if(!s)f[s++]=0;if(m)mypc('-');while(s--)mypc(f[s]+'0');mypc(c);}
  22. void writer(ll x, char c){int s=0,m=0;char f[20];if(x<0)m=1,x=-x;while(x)f[s++]=x%10,x/=10;if(!s)f[s++]=0;if(m)mypc('-');while(s--)mypc(f[s]+'0');mypc(c);}
  23. void writer(double x, char c){printf("%.15f",x);mypc(c);}
  24. void writer(const char c[]){int i;for(i=0;c[i]!='\0';i++)mypc(c[i]);}
  25. void writer(const char x[], char c){int i;for(i=0;x[i]!='\0';i++)mypc(x[i]);mypc(c);}
  26. template<class T> void writerLn(T x){writer(x,'\n');}
  27. template<class T, class S> void writerLn(T x, S y){writer(x,' ');writer(y,'\n');}
  28. template<class T, class S, class U> void writerLn(T x, S y, U z){writer(x,' ');writer(y,' ');writer(z,'\n');}
  29. template<class T> void writerArr(T x[], int n){int i;if(!n){mypc('\n');return;}rep(i,n-1)writer(x[i],' ');writer(x[n-1],'\n');}
  30.  
  31. char memarr[17000000]; void *mem = memarr;
  32. #define MD 1000000007
  33.  
  34.  
  35.  
  36. struct insertfunctions{
  37. vector<string> name;
  38. std::set<string> doit;
  39. map<string,string> func;
  40. map<string,vector<string> > need;
  41.  
  42. void set(){
  43. int i;
  44. {
  45. string n = "stdc";
  46. string c = "#include<bits/stdc++.h>\n";
  47. vector<string> d;
  48.  
  49. name.push_back(n);
  50. func[n] = c;
  51. need[n] = d;
  52. }
  53.  
  54. {
  55. string n = "namespace";
  56. string c = "using namespace std;\n";
  57. vector<string> d;
  58.  
  59. name.push_back(n);
  60. func[n] = c;
  61. need[n] = d;
  62. }
  63.  
  64. {
  65. string n = "reader_int";
  66. string c = "void rd(int &x){\n int k, m=0;\n x=0;\n for(;;){\n k = getchar_unlocked();\n if(k=='-'){\n m=1;\n break;\n }\n if('0'<=k&&k<='9'){\n x=k-'0';\n break;\n }\n }\n for(;;){\n k = getchar_unlocked();\n if(k<'0'||k>'9'){\n break;\n }\n x=x*10+k-'0';\n }\n if(m){\n x=-x;\n }\n}\n";
  67. vector<string> d;
  68.  
  69. name.push_back(n);
  70. func[n] = c;
  71. need[n] = d;
  72. }
  73.  
  74. {
  75. string n = "reader_ll";
  76. string c = "void rd(ll &x){\n int k, m=0;\n x=0;\n for(;;){\n k = getchar_unlocked();\n if(k=='-'){\n m=1;\n break;\n }\n if('0'<=k&&k<='9'){\n x=k-'0';\n break;\n }\n }\n for(;;){\n k = getchar_unlocked();\n if(k<'0'||k>'9'){\n break;\n }\n x=x*10+k-'0';\n }\n if(m){\n x=-x;\n }\n}\n";
  77. vector<string> d;
  78.  
  79. name.push_back(n);
  80. func[n] = c;
  81. need[n] = d;
  82. }
  83.  
  84. {
  85. string n = "reader_char_array";
  86. string c = "void rd(char c[]){\n int i, sz = 0;\n for(;;){\n i = getchar_unlocked();\n if(i!=' '&&i!='\\n'&&i!='\\r'&&i!='\\t'&&i!=EOF) break;\n }\n c[sz++] = i;\n for(;;){\n i = getchar_unlocked();\n if(i==' '||i=='\\n'||i=='\\r'||i=='\\t'||i==EOF) break;\n c[sz++] = i;\n }\n c[sz]='\\0';\n}";
  87. vector<string> d;
  88.  
  89. name.push_back(n);
  90. func[n] = c;
  91. need[n] = d;
  92. }
  93.  
  94. {
  95. string n = "writer_int";
  96. string c = "void wt_L(int x){\n int s=0, m=0;\n char f[10];\n if(x<0) m=1, x=-x;\n while(x) f[s++]=x%10, x/=10;\n if(!s) f[s++]=0;\n if(m) putchar_unlocked('-');\n while(s--) putchar_unlocked(f[s]+'0');\n}\n";
  97. vector<string> d;
  98.  
  99. name.push_back(n);
  100. func[n] = c;
  101. need[n] = d;
  102. }
  103.  
  104. {
  105. string n = "writer_int_withBase";
  106. string c = "void wt_L(int x, int b){\n int s=0, m=0;\n char f[35];\n if(x<0) m=1, x=-x;\n while(x) f[s++]=x%b, x/=b;\n if(!s) f[s++]=0;\n if(m) putchar_unlocked('-');\n while(s--) putchar_unlocked(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"[f[s]]);\n}\n";
  107. vector<string> d;
  108.  
  109. name.push_back(n);
  110. func[n] = c;
  111. need[n] = d;
  112. }
  113.  
  114. {
  115. string n = "writer_ll";
  116. string c = "void wt_L(ll x){\n int s=0, m=0;\n char f[20];\n if(x<0) m=1, x=-x;\n while(x) f[s++]=x%10, x/=10;\n if(!s) f[s++]=0;\n if(m) putchar_unlocked('-');\n while(s--) putchar_unlocked(f[s]+'0');\n}\n";
  117. vector<string> d;
  118.  
  119. name.push_back(n);
  120. func[n] = c;
  121. need[n] = d;
  122. }
  123.  
  124. {
  125. string n = "writer_ll_withBase";
  126. string c = "void wt_L(ll x, int b){\n int s=0, m=0;\n char f[70];\n if(x<0) m=1, x=-x;\n while(x) f[s++]=x%b, x/=b;\n if(!s) f[s++]=0;\n if(m) putchar_unlocked('-');\n while(s--) putchar_unlocked(\"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\"[f[s]]);\n}\n";
  127. vector<string> d;
  128.  
  129. name.push_back(n);
  130. func[n] = c;
  131. need[n] = d;
  132. }
  133.  
  134. {
  135. string n = "writer_char_array";
  136. string c = "void wt_L(const char c[]){\n int i=0;\n for(i=0;c[i]!='\\0';i++) putchar_unlocked(c[i]);\n}\n";
  137. vector<string> d;
  138.  
  139. name.push_back(n);
  140. func[n] = c;
  141. need[n] = d;
  142. }
  143.  
  144. {
  145. string n = "chmin";
  146. string c = "template<class S, class T> inline void chmin(S &a, T b){if(a>b)a=b;}";
  147. vector<string> d;
  148.  
  149. name.push_back(n);
  150. func[n] = c;
  151. need[n] = d;
  152. }
  153.  
  154. {
  155. string n = "chmax";
  156. string c = "template<class S, class T> inline void chmax(S &a, T b){if(a<b)a=b;}";
  157. vector<string> d;
  158.  
  159. name.push_back(n);
  160. func[n] = c;
  161. need[n] = d;
  162. }
  163.  
  164. if(0){
  165. string n = "";
  166. string c = "";
  167. vector<string> d;
  168.  
  169. name.push_back(n);
  170. func[n] = c;
  171. need[n] = d;
  172. }
  173.  
  174. doit.insert((string)"stdc");
  175. doit.insert((string)"namespace");
  176. }
  177.  
  178.  
  179. string get_insert_string(){
  180. int i, fg;
  181. map<string,vector<string> >::iterator it;
  182. vector<string> vs;
  183. string res, tmp;
  184.  
  185. for(;;){
  186. fg = 0;
  187. for(it=need.begin(); it!=need.end(); it++){
  188. tmp = it->first;
  189. vs = it->second;
  190. if(doit.count(tmp)==0) continue;
  191. rep(i,vs.size()){
  192. if(doit.count(vs[i])==0){
  193. fg++;
  194. doit.insert(vs[i]);
  195. }
  196. }
  197. }
  198. if(!fg) break;
  199. }
  200.  
  201. rep(i,name.size()){
  202. if(doit.count(name[i])){
  203. res += func[name[i]];
  204. }
  205. }
  206.  
  207. return res;
  208. }
  209. };
  210.  
  211. insertfunctions ifun;
  212. set<string> g_flags;
  213.  
  214.  
  215.  
  216. struct code{
  217. code *up;
  218.  
  219. vector<string> str, strtype;
  220. vector<int> nxt;
  221. vector<code*> nxtlst;
  222.  
  223. string name, type;
  224. std::set<string> vartype, tvartype;
  225. map<string,string> localvar, globalvar, argvar;
  226.  
  227. void set_init(){
  228. vartype.insert((string)"void");
  229. vartype.insert((string)"char");
  230. vartype.insert((string)"signed char");
  231. vartype.insert((string)"unsigned char");
  232. vartype.insert((string)"int");
  233. vartype.insert((string)"signed int");
  234. vartype.insert((string)"unsigned int");
  235. vartype.insert((string)"signed");
  236. vartype.insert((string)"unsigned");
  237. vartype.insert((string)"long");
  238. vartype.insert((string)"signed long");
  239. vartype.insert((string)"unsigned long");
  240. vartype.insert((string)"long long");
  241. vartype.insert((string)"signed long long");
  242. vartype.insert((string)"unsigned long long");
  243. vartype.insert((string)"ll");
  244. vartype.insert((string)"ull");
  245. vartype.insert((string)"float");
  246. vartype.insert((string)"double");
  247. vartype.insert((string)"bool");
  248. vartype.insert((string)"string");
  249.  
  250. tvartype.insert((string)"pair");
  251. tvartype.insert((string)"vector");
  252. tvartype.insert((string)"stack");
  253. tvartype.insert((string)"queue");
  254. tvartype.insert((string)"deque");
  255. tvartype.insert((string)"priority_queue");
  256. tvartype.insert((string)"set");
  257. tvartype.insert((string)"map");
  258. tvartype.insert((string)"unordered_set");
  259. tvartype.insert((string)"unordered_map");
  260. }
  261.  
  262.  
  263. void merge(std::set<string> &a, std::set<string> &b){
  264. std::set<string>::iterator it;
  265. for(it=b.begin();it!=b.end();it++){
  266. a.insert(*it);
  267. }
  268. }
  269. void merge(map<string,string> &a, map<string,string> &b){
  270. map<string,string>::iterator it;
  271. for(it=b.begin();it!=b.end();it++){
  272. a[it->first] = it->second;
  273. }
  274. }
  275. void set_next_types(std::set<string> &s_vartype, set<string> &s_tvartype, map<string,string> &s_localvar, map<string,string> &s_globalvar, map<string,string> &s_argvar){
  276. merge(vartype, s_vartype);
  277. merge(tvartype, s_tvartype);
  278. merge(globalvar, s_globalvar);
  279. merge(globalvar, s_localvar);
  280. merge(globalvar, s_argvar);
  281. }
  282.  
  283. void setUpnode(code *cc){
  284. up = cc;
  285. set_next_types(cc->vartype, cc->tvartype, cc->localvar, cc->globalvar, cc->argvar);
  286. }
  287.  
  288.  
  289. code* get_root(void){
  290. code *r = this;
  291. while(r->up != NULL) r = r->up;
  292. return r;
  293. }
  294.  
  295. void add_vartype(string in){
  296. int i;
  297. vartype.insert(in);
  298. rep(i,nxtlst.size()) nxtlst[i]->add_vartype(in);
  299. }
  300.  
  301. void add_tvartype(string in){
  302. int i;
  303. tvartype.insert(in);
  304. rep(i,nxtlst.size()) nxtlst[i]->add_tvartype(in);
  305. }
  306.  
  307. void add_localvar(string in1, string in2){
  308. int i;
  309. localvar[in1] = in2;
  310. rep(i,nxtlst.size()) nxtlst[i]->add_globalvar(in1, in2);
  311. }
  312.  
  313. void add_globalvar(string in1, string in2){
  314. int i;
  315. globalvar[in1] = in2;
  316. rep(i,nxtlst.size()) nxtlst[i]->add_globalvar(in1, in2);
  317. }
  318.  
  319. void add_argvar(string in1, string in2){
  320. int i;
  321. argvar[in1] = in2;
  322. rep(i,nxtlst.size()) nxtlst[i]->add_globalvar(in1, in2);
  323. }
  324.  
  325.  
  326. void ftrim(string &in){
  327. while(in.size() && isspace(in[0])) in = in.substr(1);
  328. }
  329. void etrim(string &in){
  330. while(in.size() && isspace(in[in.size()-1])) in = in.substr(0, in.size()-1);
  331. }
  332. void trim(string &in){
  333. ftrim(in);
  334. etrim(in);
  335. }
  336.  
  337. void ftrim_until(string &in, char s){
  338. while(in.size() && in[0] != s) in = in.substr(1);
  339. }
  340. void etrim_until(string &in, char t){
  341. while(in.size() && in[in.size()-1] != t) in = in.substr(0, in.size()-1);
  342. }
  343. void trim_until(string &in, char s, char t){
  344. ftrim_until(in,s);
  345. etrim_until(in,t);
  346. }
  347.  
  348.  
  349. void code_replace(string &in){
  350. trim(in);
  351. replaceAll_t(in, "ll", "long long");
  352. replaceAll_t(in, "ull", "unsigned long long");
  353. replaceAll_t(in, "int_inf", "1073709056");
  354. replaceAll_t(in, "ll_inf", "4611686016279904256LL");
  355. replaceAll_t(in, "double_inf", "1e150");
  356. }
  357.  
  358.  
  359. vector<string> split_p(string in, char c){
  360. int i;
  361. int k1 = 0, k2 = 0, k3 = 0, k4 = 0, k5 = 0;
  362. vector<string> res;
  363. string tmp;
  364.  
  365. rep(i,in.size()){
  366. if(in[i]=='(') k1++;
  367. if(in[i]==')') k1--;
  368. if(in[i]=='[') k2++;
  369. if(in[i]==']') k2--;
  370. if(in[i]=='{') k3++;
  371. if(in[i]=='}') k3--;
  372. if(in[i]=='\'') k4 ^= 1;
  373. if(in[i]=='"') k5 ^= 1;
  374. if(k1==0 && k2==0 && k3==0 && k4==0 && k5==0 && in[i]==c){
  375. res.push_back(tmp);
  376. tmp = "";
  377. } else {
  378. tmp += in[i];
  379. }
  380. }
  381.  
  382. res.push_back(tmp);
  383. return res;
  384. }
  385. vector<string> split_p2(string in, char c){
  386. int i;
  387. int k1 = 0, k2 = 0, k3 = 0, k4 = 0, k5 = 0, k6 = 0;
  388. vector<string> res;
  389. string tmp;
  390.  
  391. rep(i,in.size()){
  392. if(in[i]=='(') k1++;
  393. if(in[i]==')') k1--;
  394. if(in[i]=='[') k2++;
  395. if(in[i]==']') k2--;
  396. if(in[i]=='{') k3++;
  397. if(in[i]=='}') k3--;
  398. if(in[i]=='<') k6++;
  399. if(in[i]=='>') k6--;
  400. if(in[i]=='\'') k4 ^= 1;
  401. if(in[i]=='"') k5 ^= 1;
  402. if(k1==0 && k2==0 && k3==0 && k4==0 && k5==0 && k6==0 && in[i]==c){
  403. res.push_back(tmp);
  404. tmp = "";
  405. } else {
  406. tmp += in[i];
  407. }
  408. }
  409.  
  410. res.push_back(tmp);
  411. return res;
  412. }
  413.  
  414. int isValidVarType(string in, char nxt){
  415. int i, j, cnt;
  416.  
  417. if(isalnum(nxt)) return 0;
  418.  
  419. if(in.substr(0,6) == "const "){
  420. in = in.substr(6);
  421. ftrim(in);
  422. }
  423.  
  424. if(vartype.count(in)) return 1;
  425.  
  426. rep(i,in.size()){
  427. if(tvartype.count( in.substr(0,i) )){
  428. cnt = 0;
  429. REP(j,i,in.size()){
  430. if(cnt==0 && isalnum(in[j])) break;
  431. if(in[j]=='<') cnt++;
  432. if(in[j]=='>') cnt--;
  433. if(cnt==0 && in[j]=='>'){
  434. j++;
  435. if(j==in.size()) return 1;
  436. if(in.substr(j) == "::iterator") return 1;
  437. break;
  438. }
  439. }
  440. }
  441. }
  442.  
  443. return 0;
  444. }
  445.  
  446. pair<string, char> nextToken(string &in){
  447. int i, f, dig = 0;
  448. string res1 = "";
  449. char res2 = '\0';
  450.  
  451. i = 0;
  452. while(i < in.size() && isspace(in[i])) i++;
  453. if(i==in.size()) return make_pair(res1,res2);
  454.  
  455. if(isdigit(in[0])) dig = 1;
  456. while(i < in.size() && (isalnum(in[i]) || (dig && in[i]=='.'))) res1 += in[i++];
  457. while(i < in.size() && isspace(in[i])) i++;
  458. res2 = in[i];
  459. return make_pair(res1,res2);
  460. }
  461.  
  462. pair<string,string> var_definition(string in){
  463. int i, j, k, tt;
  464. string type, name, pre, suf, eq;
  465. vector<string> tmp;
  466.  
  467. rep(i,in.size()+1) if(isValidVarType(in.substr(0,i), in[i])) tt = i;
  468.  
  469. type = in.substr(0, tt);
  470.  
  471. in = in.substr(tt);
  472. trim(in);
  473.  
  474. if(in[in.size()-1] == ';'){
  475. in = in.substr(0, in.size()-1);
  476. trim(in);
  477. }
  478.  
  479. tmp = split_p(in, '=');
  480. assert(tmp.size() <= 2);
  481. if(tmp.size()==2){
  482. eq = tmp[1];
  483. trim(eq);
  484. in = tmp[0];
  485. }
  486.  
  487. rep(i,in.size()) if(isalpha(in[i])) break;
  488. REP(j,i,in.size()) if(!isalnum(in[j])) break;
  489. name = in.substr(i, j-i);
  490. pre = in.substr(0, i);
  491. suf = in.substr(j);
  492. trim(name);
  493. trim(pre);
  494. trim(suf);
  495.  
  496. return make_pair(name, type+","+pre+","+suf+","+eq);
  497. }
  498.  
  499. string getElementalyVarType(string in){
  500. int i;
  501. vector<string> vs;
  502.  
  503. while(in.size() && !isalpha(in[0])) in = in.substr(1);
  504. if(in.size()==0) return (string)"error";
  505. rep(i,in.size()) if(!isalnum(in[i])) break;
  506. in = in.substr(0, i);
  507.  
  508. if(localvar.count(in)){
  509. in = localvar[in];
  510. } else if(argvar.count(in)){
  511. in = argvar[in];
  512. } else if(globalvar.count(in)){
  513. in = globalvar[in];
  514. } else {
  515. return (string)"error";
  516. }
  517.  
  518. vs = split_p(in, ',');
  519. in = vs[0];
  520. return in;
  521. }
  522.  
  523. string getEquationType(string in){
  524. int i;
  525. int double_fg = 0, float_fg = 0, ull_fg = 0, ll_fg = 0, unsigned_fg = 0, int_fg = 0, char_fg = 0;
  526. pair<string,char> stchar;
  527. string tp, str;
  528.  
  529. for(;;){
  530. trim(in);
  531. if(in.size()==0) break;
  532.  
  533. if(in[0] == '['){
  534. i = pairBracket(in, 0);
  535. if(i == -1) return (string)"error";
  536. in = in.substr(i+1);
  537. continue;
  538. }
  539.  
  540. if(in[0] == '"'){
  541. char_fg = 1;
  542. for(i=1;;i++) if(in[i]=='"') break;
  543. in = in.substr(i+1);
  544. continue;
  545. }
  546.  
  547. if(in[0] == '\''){
  548. char_fg = 1;
  549. for(i=1;;i++) if(in[i]=='\'') break;
  550. in = in.substr(i+1);
  551. continue;
  552. }
  553.  
  554. stchar = nextToken(in);
  555. str = stchar.first;
  556. // fprintf(stderr,"[%s - %c]\n", stchar.first.c_str(), stchar.second);
  557. in = in.substr(str.size());
  558. if(str.size()==0) in = in.substr(1);
  559.  
  560. if(str.size()){
  561. if(isdigit(str[0])) {
  562. if(strpos(str, (string)".") >= 0){
  563. if(str[str.size()-1] == 'f') tp = "float";
  564. else tp = "double";
  565. } else {
  566. if(str.size() >= 2 && str.substr(str.size()-2) == "ll") tp = "long long";
  567. else tp = "int";
  568. }
  569. } else if(isalpha(str[0])) {
  570. tp = getElementalyVarType(str);
  571. }
  572.  
  573. if(tp == "double") double_fg = 1;
  574. if(tp == "float") float_fg = 1;
  575. if(tp == "long long") ll_fg = 1;
  576. if(tp == "int") int_fg = 1;
  577. if(tp == "char") char_fg = 1;
  578. }
  579. }
  580.  
  581. if(double_fg) return (string)"double";
  582. if(float_fg) return (string)"float";
  583. if(ll_fg) return (string)"long long";
  584. if(int_fg) return (string)"int";
  585. if(char_fg) return (string)"char";
  586. return (string)"error";
  587. }
  588.  
  589. string getUnusedVarName(void){
  590. int i, k, p, r;
  591. string f = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_";
  592. string res;
  593.  
  594. for(k=8;;k++) rep(p,100){
  595. res = "";
  596.  
  597. r = rand()%52;
  598. res += f[r];
  599. REP(i,1,k){
  600. r = rand()%f.size();
  601. res += f[r];
  602. }
  603.  
  604. if(localvar.count(res)) continue;
  605. if(argvar.count(res)) continue;
  606. if(globalvar.count(res)) continue;
  607. return res;
  608. }
  609.  
  610. return res;
  611. }
  612.  
  613. void insert(string &in, int p){
  614. int pure;
  615. for(;;){
  616. ftrim(in);
  617. if(in.size()==0) break;
  618.  
  619. if(in[0]=='{') pure = 1; else pure = 0;
  620.  
  621. code *cc = new code;
  622. cc->setUpnode(this);
  623. cc->set(in, (string)"block");
  624. nxt.insert(nxt.begin()+p, nxtlst.size());
  625. nxtlst.push_back(cc);
  626. str.insert(str.begin()+p, (string)"");
  627. if(pure){
  628. strtype.insert(strtype.begin()+p, (string)"block");
  629. } else {
  630. strtype.insert(strtype.begin()+p, (string)"block-inserted");
  631. }
  632.  
  633. p++;
  634. }
  635. }
  636.  
  637. int strpos(string &A, string B){
  638. int i, As, Bs;
  639. As = A.size();
  640. Bs = B.size();
  641. rep(i,As-Bs+1) if(A.substr(i,Bs) == B) return i;
  642. return -1;
  643. }
  644.  
  645. int replaceAll(string &A, string B, string C){
  646. int i, res = 0;
  647. for(;;){
  648. i = strpos(A, B);
  649. if(i==-1) break;
  650. A = A.substr(0, i) + C + A.substr(i+B.size());
  651. }
  652. return res;
  653. }
  654.  
  655. int strpos_t(string &A, string B){
  656. int i, As, Bs;
  657. As = A.size();
  658. Bs = B.size();
  659. rep(i,As-Bs+1) if(A.substr(i,Bs) == B){
  660. if(i && (isalnum(A[i-1]) || A[i-1]=='_')) continue;
  661. if(i+Bs<As && (isalnum(A[i+Bs]) || A[i+Bs]=='_')) continue;
  662. return i;
  663. }
  664. return -1;
  665. }
  666.  
  667. int replaceAll_t(string &A, string B, string C){
  668. int i, res = 0;
  669. for(;;){
  670. i = strpos_t(A, B);
  671. if(i==-1) break;
  672. A = A.substr(0, i) + C + A.substr(i+B.size());
  673. }
  674. return res;
  675. }
  676.  
  677. vector<string> rd_wt_array(string in){ // 1+((a,b)(N)+2) returns "1+(", "(a,b)", "N", "+2)", hoge returns "hoge"
  678. int i, j, k, bf = -1, fg;
  679. vector<string> res;
  680.  
  681. rep(i,in.size()){
  682. fg = 0;
  683. if(bf == ')' || bf == ']') fg = 1;
  684. if(isalnum(bf)) fg = 1;
  685. if(fg && in[i] == '('){
  686. rep(k,4) res.push_back((string)"");
  687. j = pairBracket(in, i);
  688. res[2] = in.substr(i+1, j-i-1);
  689. res[3] = in.substr(j+1);
  690. in = in.substr(0, i);
  691.  
  692. trim(in);
  693. i = in.size() - 1;
  694. while(in[i] == ']'){
  695. i = pairBracket(in, i) - 1;
  696. while(isspace(in[i])) i--;
  697. }
  698. if(in[i]==')'){
  699. i = pairBracket(in, i);
  700. res[0] = in.substr(0, i);
  701. res[1] = in.substr(i);
  702. } else {
  703. while(i >= 0 && isalnum(in[i])) i--;
  704. i++;
  705. res[0] = in.substr(0, i);
  706. res[1] = in.substr(i);
  707. }
  708.  
  709. rep(k,4) trim(res[k]);
  710. return res;
  711. }
  712. if(!isspace(in[i])) bf = in[i];
  713. }
  714.  
  715. res.push_back(in);
  716. return res;
  717. }
  718.  
  719. int checkBracketsCoressponding(string &in){
  720. int i;
  721. int k4, k5;
  722. stack<int> s;
  723.  
  724. k4 = k5 = 0;
  725. rep(i,in.size()){
  726. if(k4==0 && k5==0){
  727. if(in[i] == '(') s.push(1);
  728. if(in[i] == '[') s.push(2);
  729. if(in[i] == '{') s.push(3);
  730. if(in[i] == ')'){
  731. if(s.size()==0 || s.top()!=1) return 0;
  732. s.pop();
  733. }
  734. if(in[i] == ']'){
  735. if(s.size()==0 || s.top()!=2) return 0;
  736. s.pop();
  737. }
  738. if(in[i] == '}'){
  739. if(s.size()==0 || s.top()!=3) return 0;
  740. s.pop();
  741. }
  742. }
  743. if(in[i] == '\'') k4^=1;
  744. if(in[i] == '"') k5^=1;
  745. }
  746. if(k4 || k5 || s.size()) return 0;
  747. return 1;
  748. }
  749.  
  750. int pairBracket(string &in, int p){
  751. int i;
  752. int k1, k2, k3, k4, k5;
  753.  
  754. k1 = k2 = k3 = k4 = k5 = 0;
  755. if(in[p]=='(' || in[p]=='[' || in[p]=='{'){
  756. for(i=p;i<in.size();i++){
  757. if(k4==0 && k5==0){
  758. if(in[i] == '(') k1++;
  759. if(in[i] == ')') k1--;
  760. if(in[i] == '[') k2++;
  761. if(in[i] == ']') k2--;
  762. if(in[i] == '{') k3++;
  763. if(in[i] == '}') k3--;
  764. }
  765. if(in[i] == '\'') k4^=1;
  766. if(in[i] == '"') k5^=1;
  767. if(k1==0 && k2==0 && k3==0 && k4==0 && k5==0) return i;
  768. }
  769. } else if(in[p]==')' || in[p]==']' || in[p]=='}'){
  770. for(i=p;i>=0;i--){
  771. if(k4==0 && k5==0){
  772. if(in[i] == '(') k1++;
  773. if(in[i] == ')') k1--;
  774. if(in[i] == '[') k2++;
  775. if(in[i] == ']') k2--;
  776. if(in[i] == '{') k3++;
  777. if(in[i] == '}') k3--;
  778. }
  779. if(in[i] == '\'') k4^=1;
  780. if(in[i] == '"') k5^=1;
  781. if(k1==0 && k2==0 && k3==0 && k4==0 && k5==0) return i;
  782. }
  783. }
  784. return -1;
  785. }
  786.  
  787. void set(string &in, string tp){
  788. int i, j, k, st, cnt, tt, fg;
  789. int k1, k2, k3, k4, k5;
  790. int end_type = 0;
  791. int fg_main = 0, fg_return = 0;
  792. string tmp, tmpstr;
  793. string str_type, str_var;
  794. vector<string> str_arg;
  795. pair<string, char> stchar;
  796. vector<string> vtmp;
  797.  
  798. type = tp;
  799. set_init();
  800.  
  801. ftrim(in);
  802. if(tp != "program" && in[0]=='{') end_type = 1, in = in.substr(1);
  803. if(tp == "program") end_type = 2;
  804.  
  805. for(;;){
  806. ftrim(in);
  807. // printf("--- %s\n",in.substr(0,10).c_str());
  808.  
  809. if(in.substr(0,13) == "//no-unlocked" && (isspace(in[13]) || in[13]=='\0')){
  810. g_flags.insert((string)"no-unlocked");
  811. in = in.substr(13);
  812. continue;
  813. }
  814.  
  815. if(in.substr(0,2) == "//"){
  816. rep(i,in.size()) if(in[i] == '\n'){ i++; break; }
  817. in = in.substr(i);
  818. continue;
  819. }
  820. if(in.substr(0,2) == "/*"){
  821. REP(i,1,in.size()) if(in.substr(i-1,2) == "*/"){ i++; break; }
  822. in = in.substr(i);
  823. continue;
  824. }
  825.  
  826. if(end_type==-1) break;
  827. if(end_type==0) end_type = -1;
  828.  
  829. if(in.size()==0 && end_type==2) break;
  830. if(in.size() && in[0]=='}' && end_type==1){
  831. in = in.substr(1);
  832. if(name == "int main()" && fg_return == 0){
  833. str.push_back((string)"return 0;");
  834. nxt.push_back(-1);
  835. strtype.push_back((string)"sentence");
  836. }
  837. break;
  838. }
  839.  
  840.  
  841. if(in.substr(0,8) == "#include"){
  842. cnt = 0;
  843. for(i=0;;i++){
  844. if(in[i]=='"') cnt++;
  845. if(cnt==2 || in[i]=='>'){ i++; break; }
  846. }
  847. tmp = in.substr(0, i);
  848. in = in.substr(i);
  849. str.push_back(tmp);
  850. nxt.push_back(-1);
  851. strtype.push_back((string)"sentence-include");
  852. continue;
  853. }
  854.  
  855. if(in.substr(0,7) == "#define"){
  856. for(i=0;;i++){
  857. if(in[i]=='\n' || in[i]=='\r') break;
  858. }
  859. tmp = in.substr(0, i);
  860. in = in.substr(i);
  861. str.push_back(tmp);
  862. nxt.push_back(-1);
  863. strtype.push_back((string)"sentence-define");
  864. continue;
  865. }
  866.  
  867.  
  868. tmpstr = "";
  869. for(;;){
  870. stchar = nextToken(in);
  871. // printf("[%s] [%c]\n",stchar.first.c_str(),stchar.second);
  872. if(stchar.first == "template"){
  873. cnt = 0;
  874. for(i=0;;i++){
  875. if(in[i]=='<') cnt++;
  876. if(in[i]=='>') cnt--;
  877. if(cnt==0 && in[i]=='>'){ i++; break; }
  878. }
  879. tmpstr += in.substr(0, i) + " ";
  880. in = in.substr(i);
  881. ftrim(in);
  882. continue;
  883. }
  884.  
  885. if(stchar.first == "inline"){
  886. tmpstr += "inline ";
  887. in = in.substr(6);
  888. ftrim(in);
  889. continue;
  890. }
  891.  
  892. break;
  893. }
  894.  
  895. fg = 0;
  896.  
  897. tt = -1;
  898. REP(i,1,100) if(isValidVarType(in.substr(0,i), in[i])) tt = i;
  899.  
  900. stchar = nextToken(in);
  901.  
  902. if(tt >= 0){
  903. for(i=0;;i++){
  904. if(in[i] == ';') break;
  905. if(in[i] == '('){ fg++; stchar.first = "function"; break; }
  906. }
  907. }
  908.  
  909. if(stchar.first == "if" && stchar.second =='(') fg = 1;
  910. if(stchar.first == "for" && stchar.second =='(') fg = 1;
  911. if(stchar.first == "rep" && stchar.second =='(') fg = 1;
  912. if(stchar.first == "REP" && stchar.second =='(') fg = 1;
  913. if(stchar.first == "while" && stchar.second =='(') fg = 1;
  914. if(stchar.first == "else") fg = 2;
  915. if(stchar.first == "struct") fg = 3;
  916.  
  917. if(fg==2){
  918. string str_t = in.substr(4,100);
  919. pair<string,char> stch_t = nextToken(str_t);
  920. if(stch_t.first == "if" && stch_t.second == '('){
  921. fg = 1;
  922. stchar.first = "else if";
  923. }
  924. }
  925.  
  926. if(fg || in[0]=='{'){
  927. fg_return = 0;
  928.  
  929. if(fg==1){
  930. cnt = 0;
  931. rep(i,in.size()){
  932. if(in[i] == '(') cnt++;
  933. if(in[i] == ')') cnt--;
  934. if(in[i] == ')' && cnt == 0){
  935. i++; break;
  936. }
  937. }
  938. } else if(fg==2) {
  939. i = stchar.first.size();
  940. } else if(fg==3) {
  941. rep(i,in.size()) if(in[i]=='{' || in[i] == ';') break;
  942. tmp = in.substr(0, i);
  943. trim(tmp);
  944. vtmp = split_p(tmp, ' ');
  945. if(tmpstr.size() == 0) add_vartype(vtmp[vtmp.size()-1]);
  946. else add_tvartype(vtmp[vtmp.size()-1]);
  947. } else {
  948. i = 0;
  949. }
  950. tmp = in.substr(0, i);
  951. in = in.substr(i);
  952.  
  953. // printf("[[ %s : %s : fg = %d]]\n", tmp.c_str(), in.substr(0,10).c_str(), fg);
  954. // exit(0);
  955.  
  956. code_replace(tmp);
  957.  
  958. if(type=="program" && tmp=="" && fg_main==0) tmp = "int main()", fg_main = 1;
  959.  
  960. if(tmp.substr(0,3) == "rep" || tmp.substr(0,3) == "REP"){
  961. while(tmp[0]!='(') tmp = tmp.substr(1);
  962. while(tmp[tmp.size()-1]!=')') tmp = tmp.substr(0, tmp.size()-1);
  963. tmp = tmp.substr(1, tmp.size()-2);
  964. str_arg = split_p(tmp, ',');
  965. if(str_arg.size()==2){
  966. tmp = (string)"for(" + str_arg[0] + "=0;" + str_arg[0] + "<" + str_arg[1] + ";" + str_arg[0] + "++)";
  967. } else if(str_arg.size()==3){
  968. tmp = (string)"for(" + str_arg[0] + "=" + str_arg[1] + ";" + str_arg[0] + "<" + str_arg[2] + ";" + str_arg[0] + "++)";
  969. } else {
  970. assert(0);
  971. }
  972. stchar.first = "for";
  973. }
  974.  
  975. code *cc = new code;
  976. cc->setUpnode(this);
  977.  
  978. if(tmpstr.size()){
  979. string tt = tmpstr;
  980. trim_until(tt, '<', '>');
  981. assert(tt.size()>=2);
  982. tt = tt.substr(1, tt.size()-2);
  983. vtmp = split_p(tt, ',');
  984. rep(i,vtmp.size()){
  985. trim(vtmp[i]);
  986. if(vtmp[i].substr(0,6)=="class "){
  987. vtmp[i] = vtmp[i].substr(5);
  988. trim(vtmp[i]);
  989. cc->vartype.insert(vtmp[i]);
  990. }
  991. }
  992. }
  993. if(stchar.first == "function"){
  994. string tt = tmp;
  995. pair<string,string> ss;
  996. trim_until(tt, '(', ')');
  997. assert(tt.size()>=2);
  998. tt = tt.substr(1, tt.size()-2);
  999. vtmp = split_p(tt, ',');
  1000. rep(i,vtmp.size()){
  1001. trim(vtmp[i]);
  1002. if(vtmp[i].size()==0 || vtmp[i]=="void") continue;
  1003. ss = cc->var_definition(vtmp[i]);
  1004. cc->argvar[ss.first] = ss.second;
  1005. }
  1006. }
  1007. if(stchar.first == "for"){
  1008. }
  1009.  
  1010. cc->name = tmpstr + tmp;
  1011. cc->set(in, (string)"block");
  1012. nxt.push_back(nxtlst.size());
  1013. nxtlst.push_back(cc);
  1014. str.push_back(tmpstr + tmp);
  1015. strtype.push_back((string)"block-"+stchar.first);
  1016. continue;
  1017. }
  1018.  
  1019. k1 = k2 = k3 = k4 = k5 = 0;
  1020. st = 0;
  1021. if(tt != -1) st = tt;
  1022.  
  1023. for(i=st;;i++){
  1024. if(k4==0 && k5==0){
  1025. if(in[i] == '(') k1++;
  1026. if(in[i] == ')') k1--;
  1027. if(in[i] == '[') k2++;
  1028. if(in[i] == ']') k2--;
  1029. if(in[i] == '{') k3++;
  1030. if(in[i] == '}') k3--;
  1031. }
  1032. if(in[i] == '\'') k4^=1;
  1033. if(in[i] == '"') k5^=1;
  1034.  
  1035. if(k1==0 && k2==0 && k3==0 && k4==0 && k5==0){
  1036. if(in[i] == ',' || in[i] == ';'){
  1037. tmp = in.substr(st, i+1-st);
  1038. tmp[tmp.size()-1] = ';';
  1039.  
  1040. if(tt >= 0){
  1041. if(isalnum(tmp[0])) tmp = " "+tmp;
  1042. str_type = in.substr(0, tt);
  1043. tmp = str_type + tmp;
  1044.  
  1045. code_replace(tmp);
  1046.  
  1047. pair<string,string> pss = var_definition(tmp);
  1048. str_var = pss.first;
  1049. str_type = pss.second;
  1050. localvar[str_var] = str_type;
  1051. }
  1052.  
  1053. code_replace(tmp);
  1054. if(strpos(tmp, (string)">?=") >= 0){
  1055. string bf, af;
  1056. k = strpos(tmp, (string)">?=");
  1057. ifun.doit.insert((string)"chmax");
  1058.  
  1059. bf = tmp.substr(0,k);
  1060. af = tmp.substr(k+3);
  1061. af = af.substr(0, af.size()-1);
  1062. trim(bf);
  1063. trim(af);
  1064. tmp = (string)"chmax(" + bf + ", " + af + ");";
  1065. }
  1066. if(strpos(tmp, (string)"<?=") >= 0){
  1067. string bf, af;
  1068. k = strpos(tmp, (string)"<?=");
  1069. ifun.doit.insert((string)"chmin");
  1070.  
  1071. bf = tmp.substr(0,k);
  1072. af = tmp.substr(k+3);
  1073. af = af.substr(0, af.size()-1);
  1074. trim(bf);
  1075. trim(af);
  1076. tmp = (string)"chmin(" + bf + ", " + af + ");";
  1077. }
  1078.  
  1079. //cout << tmpstr + tmp << endl;
  1080. stchar = nextToken(tmp);
  1081. if(stchar.first == "return") fg_return = 1; else fg_return = 0;
  1082.  
  1083. // printf("[%s][%c]\n",stchar.first.c_str(), stchar.second);
  1084. if( (stchar.first == "rd" || stchar.first == "reader") && stchar.second == '(' ){
  1085. trim_until(tmp, '(', ')');
  1086. tmp = tmp.substr(1,tmp.size()-2);
  1087. vtmp = split_p(tmp, ',');
  1088. rep(k,vtmp.size()){
  1089. trim(vtmp[k]);
  1090. string etype = getElementalyVarType(vtmp[k]);
  1091. string stc;
  1092.  
  1093. if(etype=="int"){
  1094. ifun.doit.insert((string)"reader_int");
  1095. } else if(etype=="long long"){
  1096. ifun.doit.insert((string)"reader_ll");
  1097. } else if(etype=="char"){
  1098. ifun.doit.insert((string)"reader_char_array");
  1099. } else {
  1100. fprintf(stderr, "unknown type [%s] for rd (reader)\n", etype.c_str());
  1101. assert(0);
  1102. }
  1103.  
  1104. string strtmp;
  1105. vector<string> vstrtmp;
  1106.  
  1107. strtmp = vtmp[k];
  1108. trim(strtmp);
  1109. vstrtmp = rd_wt_array(strtmp);
  1110. if(vstrtmp.size() > 1){
  1111. string vn = getUnusedVarName(), var;
  1112.  
  1113. if(vstrtmp[1][0]=='('){
  1114. vector<string> vars;
  1115. vstrtmp[1] = vstrtmp[1].substr(1, vstrtmp[1].size()-2);
  1116. vars = split_p(vstrtmp[1], ',');
  1117. var = "";
  1118. rep(j,vars.size()){
  1119. if(j) var += ", ";
  1120. trim(vars[j]);
  1121. var += vstrtmp[0] + vars[j] + "[" + vn + "]" + vstrtmp[3];
  1122. }
  1123. } else {
  1124. var = vstrtmp[0] + vstrtmp[1] + "[" + vn + "]" + vstrtmp[3];
  1125. }
  1126. stc = (string)"{ int " + vn + "; rep(" + vn + "," + vstrtmp[2] + ") rd(" + var + "); }";
  1127. insert(stc, str.size());
  1128. } else {
  1129. stc = (string)"rd(" + vstrtmp[0] + ");";
  1130.  
  1131. str.push_back(stc);
  1132. nxt.push_back(-1);
  1133. strtype.push_back((string)"sentence");
  1134. }
  1135.  
  1136. }
  1137. } else if( (stchar.first == "wt" || stchar.first == "writer") && (stchar.second == '[' || stchar.second == '(') ){
  1138. string optarg = "", basestr = "";
  1139. if(stchar.second == '['){
  1140. int ss, tt;
  1141. string stmp; vector<string> vtmp1, vtmp2;
  1142. pair<string,char> ctmp;
  1143.  
  1144. ss = strpos(tmp, "[");
  1145. tt = pairBracket(tmp, ss);
  1146. optarg = tmp.substr(ss, tt-ss+1);
  1147. tmp = tmp.substr(tt+1);
  1148.  
  1149. stmp = optarg.substr(1, optarg.size()-2);
  1150. vtmp1 = split_p(stmp, ',');
  1151. rep(k,vtmp1.size()){
  1152. trim(vtmp1[k]);
  1153. ctmp = nextToken(vtmp1[k]);
  1154. if(ctmp.first == "B" && ctmp.second == '='){
  1155. vtmp2 = split_p(vtmp1[k], '=');
  1156. trim(vtmp2[1]);
  1157. basestr = "," + vtmp2[1];
  1158. }
  1159. }
  1160. }
  1161.  
  1162.  
  1163. trim_until(tmp, '(', ')');
  1164. tmp = tmp.substr(1,tmp.size()-2);
  1165. vtmp = split_p(tmp, ',');
  1166. rep(k,vtmp.size()){
  1167. trim(vtmp[k]);
  1168. string etype = getEquationType(vtmp[k]);
  1169. string stc;
  1170.  
  1171. if(etype=="int"){
  1172. if(basestr=="") ifun.doit.insert((string)"writer_int");
  1173. else ifun.doit.insert((string)"writer_int_withBase");
  1174. } else if(etype=="long long"){
  1175. if(basestr=="") ifun.doit.insert((string)"writer_ll");
  1176. else ifun.doit.insert((string)"writer_ll_withBase");
  1177. } else if(etype=="char"){
  1178. ifun.doit.insert((string)"writer_char_array");
  1179. } else {
  1180. assert(0);
  1181. }
  1182.  
  1183. string strtmp;
  1184. vector<string> vstrtmp;
  1185.  
  1186. strtmp = vtmp[k];
  1187. trim(strtmp);
  1188. vstrtmp = rd_wt_array(strtmp);
  1189. if(vstrtmp.size() > 1){
  1190. string vn = getUnusedVarName(), var;
  1191.  
  1192. if(vstrtmp[1][0]=='('){
  1193. vector<string> vars;
  1194. vstrtmp[1] = vstrtmp[1].substr(1, vstrtmp[1].size()-2);
  1195. vars = split_p(vstrtmp[1], ',');
  1196. var = "";
  1197. rep(j,vars.size()){
  1198. if(j) var += ", ";
  1199. trim(vars[j]);
  1200. var += vstrtmp[0] + vars[j] + "[" + vn + "]" + vstrtmp[3];
  1201. }
  1202. } else {
  1203. var = vstrtmp[0] + vstrtmp[1] + "[" + vn + "]" + vstrtmp[3];
  1204. }
  1205.  
  1206. if(k==vtmp.size()-1){
  1207. stc = (string)"{\n int "+vn+";\n if("+vstrtmp[2]+"==0) putchar_unlocked('\\n');\n else {\n rep("+vn+","+vstrtmp[2]+"-1) wtSp" + optarg + "("+var+");\n wt" + optarg + "("+var+");\n }\n}";
  1208. } else {
  1209. stc = (string)"{ int " + vn + "; rep(" + vn + "," + vstrtmp[2] + ") wtSp" + optarg + "(" + var + "); }";
  1210. }
  1211. insert(stc, str.size());
  1212. } else {
  1213. if(etype=="int" || etype=="long long") vstrtmp[0] += basestr;
  1214. stc = (string)"wt_L(" + vstrtmp[0] + ");";
  1215.  
  1216. str.push_back(stc);
  1217. nxt.push_back(-1);
  1218. strtype.push_back((string)"sentence");
  1219.  
  1220. if(k==vtmp.size()-1){
  1221. stc = (string)"putchar_unlocked('\\n');";
  1222. } else {
  1223. stc = (string)"putchar_unlocked(' ');";
  1224. }
  1225. str.push_back(stc);
  1226. nxt.push_back(-1);
  1227. strtype.push_back((string)"sentence");
  1228. }
  1229.  
  1230. }
  1231. } else if( (stchar.first == "wtSp" || stchar.first == "writerSp") && (stchar.second == '[' || stchar.second == '(') ){
  1232. string optarg = "", basestr = "";
  1233. if(stchar.second == '['){
  1234. int ss, tt;
  1235. string stmp; vector<string> vtmp1, vtmp2;
  1236. pair<string,char> ctmp;
  1237.  
  1238. ss = strpos(tmp, "[");
  1239. tt = pairBracket(tmp, ss);
  1240. optarg = tmp.substr(ss, tt-ss+1);
  1241. tmp = tmp.substr(tt+1);
  1242.  
  1243. stmp = optarg.substr(1, optarg.size()-2);
  1244. vtmp1 = split_p(stmp, ',');
  1245. rep(k,vtmp1.size()){
  1246. trim(vtmp1[k]);
  1247. ctmp = nextToken(vtmp1[k]);
  1248. if(ctmp.first == "B" && ctmp.second == '='){
  1249. vtmp2 = split_p(vtmp1[k], '=');
  1250. trim(vtmp2[1]);
  1251. basestr = "," + vtmp2[1];
  1252. }
  1253. }
  1254. }
  1255.  
  1256. trim_until(tmp, '(', ')');
  1257. tmp = tmp.substr(1,tmp.size()-2);
  1258. vtmp = split_p(tmp, ',');
  1259. rep(k,vtmp.size()){
  1260. trim(vtmp[k]);
  1261. string etype = getEquationType(vtmp[k]);
  1262. string stc;
  1263.  
  1264. if(etype=="int"){
  1265. if(basestr=="") ifun.doit.insert((string)"writer_int");
  1266. else ifun.doit.insert((string)"writer_int_withBase");
  1267. } else if(etype=="long long"){
  1268. if(basestr=="") ifun.doit.insert((string)"writer_ll");
  1269. else ifun.doit.insert((string)"writer_ll_withBase");
  1270. } else if(etype=="char"){
  1271. ifun.doit.insert((string)"writer_char_array");
  1272. } else {
  1273. assert(0);
  1274. }
  1275.  
  1276. string strtmp;
  1277. vector<string> vstrtmp;
  1278.  
  1279. strtmp = vtmp[k];
  1280. trim(strtmp);
  1281. vstrtmp = rd_wt_array(strtmp);
  1282. if(vstrtmp.size() > 1){
  1283. string vn = getUnusedVarName(), var;
  1284.  
  1285. if(vstrtmp[1][0]=='('){
  1286. vector<string> vars;
  1287. vstrtmp[1] = vstrtmp[1].substr(1, vstrtmp[1].size()-2);
  1288. vars = split_p(vstrtmp[1], ',');
  1289. var = "";
  1290. rep(j,vars.size()){
  1291. if(j) var += ", ";
  1292. trim(vars[j]);
  1293. var += vstrtmp[0] + vars[j] + "[" + vn + "]" + vstrtmp[3];
  1294. }
  1295. } else {
  1296. var = vstrtmp[0] + vstrtmp[1] + "[" + vn + "]" + vstrtmp[3];
  1297. }
  1298.  
  1299. stc = (string)"{ int " + vn + "; rep(" + vn + "," + vstrtmp[2] + ") wtSp" + optarg + "(" + var + "); }";
  1300. insert(stc, str.size());
  1301. } else {
  1302. if(etype=="int" || etype=="long long") vstrtmp[0] += basestr;
  1303. stc = (string)"wt_L(" + vstrtmp[0] + ");";
  1304.  
  1305. str.push_back(stc);
  1306. nxt.push_back(-1);
  1307. strtype.push_back((string)"sentence");
  1308.  
  1309. stc = (string)"putchar_unlocked(' ');";
  1310. str.push_back(stc);
  1311. nxt.push_back(-1);
  1312. strtype.push_back((string)"sentence");
  1313. }
  1314.  
  1315. }
  1316. } else if( (stchar.first == "wtLn" || stchar.first == "writerLn") && (stchar.second == '[' || stchar.second == '(') ){
  1317. string optarg = "", basestr = "";
  1318. if(stchar.second == '['){
  1319. int ss, tt;
  1320. string stmp; vector<string> vtmp1, vtmp2;
  1321. pair<string,char> ctmp;
  1322.  
  1323. ss = strpos(tmp, "[");
  1324. tt = pairBracket(tmp, ss);
  1325. optarg = tmp.substr(ss, tt-ss+1);
  1326. tmp = tmp.substr(tt+1);
  1327.  
  1328. stmp = optarg.substr(1, optarg.size()-2);
  1329. vtmp1 = split_p(stmp, ',');
  1330. rep(k,vtmp1.size()){
  1331. trim(vtmp1[k]);
  1332. ctmp = nextToken(vtmp1[k]);
  1333. if(ctmp.first == "B" && ctmp.second == '='){
  1334. vtmp2 = split_p(vtmp1[k], '=');
  1335. trim(vtmp2[1]);
  1336. basestr = "," + vtmp2[1];
  1337. }
  1338. }
  1339. }
  1340.  
  1341. trim_until(tmp, '(', ')');
  1342. tmp = tmp.substr(1,tmp.size()-2);
  1343. vtmp = split_p(tmp, ',');
  1344. rep(k,vtmp.size()){
  1345. trim(vtmp[k]);
  1346. string etype = getEquationType(vtmp[k]);
  1347. string stc;
  1348.  
  1349. if(etype=="int"){
  1350. if(basestr=="") ifun.doit.insert((string)"writer_int");
  1351. else ifun.doit.insert((string)"writer_int_withBase");
  1352. } else if(etype=="long long"){
  1353. if(basestr=="") ifun.doit.insert((string)"writer_ll");
  1354. else ifun.doit.insert((string)"writer_ll_withBase");
  1355. } else if(etype=="char"){
  1356. ifun.doit.insert((string)"writer_char_array");
  1357. } else {
  1358. assert(0);
  1359. }
  1360.  
  1361. string strtmp;
  1362. vector<string> vstrtmp;
  1363.  
  1364. strtmp = vtmp[k];
  1365. trim(strtmp);
  1366. vstrtmp = rd_wt_array(strtmp);
  1367. if(vstrtmp.size() > 1){
  1368. string vn = getUnusedVarName(), var;
  1369.  
  1370. if(vstrtmp[1][0]=='('){
  1371. vector<string> vars;
  1372. vstrtmp[1] = vstrtmp[1].substr(1, vstrtmp[1].size()-2);
  1373. vars = split_p(vstrtmp[1], ',');
  1374. var = "";
  1375. rep(j,vars.size()){
  1376. if(j) var += ", ";
  1377. trim(vars[j]);
  1378. var += vstrtmp[0] + vars[j] + "[" + vn + "]" + vstrtmp[3];
  1379. }
  1380. } else {
  1381. var = vstrtmp[0] + vstrtmp[1] + "[" + vn + "]" + vstrtmp[3];
  1382. }
  1383.  
  1384. stc = (string)"{ int " + vn + "; rep(" + vn + "," + vstrtmp[2] + ") wtLn" + optarg + "(" + var + "); }";
  1385. insert(stc, str.size());
  1386. } else {
  1387. if(etype=="int" || etype=="long long") vstrtmp[0] += basestr;
  1388. stc = (string)"wt_L(" + vstrtmp[0] + ");";
  1389.  
  1390. str.push_back(stc);
  1391. nxt.push_back(-1);
  1392. strtype.push_back((string)"sentence");
  1393.  
  1394. stc = (string)"putchar_unlocked('\\n');";
  1395. str.push_back(stc);
  1396. nxt.push_back(-1);
  1397. strtype.push_back((string)"sentence");
  1398. }
  1399.  
  1400. }
  1401. } else if(strpos(tmp, (string)"..") >= 0) {
  1402. int pl, pb, pa, fg = 0;
  1403. int k1, k2, k3, k4, k5;
  1404. string dots = "..";
  1405. string vn, stc, bg, ed, fbg, fed;
  1406.  
  1407. while(strpos(tmp, dots) >= 0) dots += ".";
  1408. dots = dots.substr(1);
  1409.  
  1410. vn = getUnusedVarName();
  1411. stc = (string)"{ int " + vn + ";";
  1412.  
  1413. for(;;){
  1414. pl = strpos(tmp, dots);
  1415. if(pl<0) break;
  1416.  
  1417. k1 = k2 = k3 = k4 = k5 = 0;
  1418. for(k=pl-1;k>=0;k--){
  1419. if(k4==0 && k5==0){
  1420. if(tmp[k] == '(') k1++;
  1421. if(tmp[k] == ')') k1--;
  1422. if(tmp[k] == '[') k2++;
  1423. if(tmp[k] == ']') k2--;
  1424. if(tmp[k] == '{') k3++;
  1425. if(tmp[k] == '}') k3--;
  1426. }
  1427. if(tmp[k] == '\'') k4^=1;
  1428. if(tmp[k] == '"') k5^=1;
  1429. if(k1 > 0 || k2 > 0 || k3 > 0) break;
  1430. }
  1431. pb = k + 1;
  1432.  
  1433. k1 = k2 = k3 = k4 = k5 = 0;
  1434. REP(k,pl,tmp.size()){
  1435. if(k4==0 && k5==0){
  1436. if(tmp[k] == '(') k1++;
  1437. if(tmp[k] == ')') k1--;
  1438. if(tmp[k] == '[') k2++;
  1439. if(tmp[k] == ']') k2--;
  1440. if(tmp[k] == '{') k3++;
  1441. if(tmp[k] == '}') k3--;
  1442. }
  1443. if(tmp[k] == '\'') k4^=1;
  1444. if(tmp[k] == '"') k5^=1;
  1445. if(k1 < 0 || k2 < 0 || k3 < 0) break;
  1446. }
  1447. pa = k;
  1448.  
  1449. bg = tmp.substr(pb, pl-pb);
  1450. ed = tmp.substr(pl+dots.size(), pa-pl-dots.size());
  1451.  
  1452. if(fg==0){
  1453. fg = 1;
  1454. fbg = bg;
  1455. fed = ed;
  1456. }
  1457. if(bg==fbg) tmp = tmp.substr(0, pb) + vn + tmp.substr(pa);
  1458. else tmp = tmp.substr(0, pb) + vn + " - (" + fbg + ") + (" + bg + ")" + tmp.substr(pa);
  1459. }
  1460.  
  1461. stc += "rep(" + vn + ", " + fbg + ", (" + fed + ") + 1) ";
  1462. stc += tmp;
  1463.  
  1464. stc += "}";
  1465. insert(stc, str.size());
  1466.  
  1467. } else {
  1468.  
  1469. str.push_back(tmpstr + tmp);
  1470. nxt.push_back(-1);
  1471. if(tt==-1){
  1472. strtype.push_back((string)"sentence");
  1473. } else {
  1474. strtype.push_back((string)"sentence-var-def");
  1475. }
  1476. }
  1477.  
  1478. if(in[i] == ','){
  1479. st = i+1;
  1480. continue;
  1481. } else {
  1482. i++;
  1483. break;
  1484. }
  1485. }
  1486. }
  1487. }
  1488. in = in.substr(i);
  1489. continue;
  1490.  
  1491. }
  1492. }
  1493.  
  1494. void debug_writer(int tab = 0){
  1495. int i, j;
  1496.  
  1497. std::set<string>::iterator it1;
  1498. map<string,string>::iterator it2;
  1499. printf("vartype :");
  1500. for(it1=vartype.begin();it1!=vartype.end();it1++) printf(" (%s)", it1->c_str()); puts("");
  1501. printf("tvartype :");
  1502. for(it1=tvartype.begin();it1!=tvartype.end();it1++) printf(" (%s)", it1->c_str()); puts("");
  1503. printf("localvar :");
  1504. for(it2=localvar.begin();it2!=localvar.end();it2++) printf(" (%s->%s)", it2->first.c_str(), it2->second.c_str()); puts("");
  1505. printf("globalvar:");
  1506. for(it2=globalvar.begin();it2!=globalvar.end();it2++) printf(" (%s->%s)", it2->first.c_str(), it2->second.c_str()); puts("");
  1507. printf("argvar :");
  1508. for(it2=argvar.begin();it2!=argvar.end();it2++) printf(" (%s->%s)", it2->first.c_str(), it2->second.c_str()); puts("");
  1509.  
  1510. rep(i,str.size()){
  1511. rep(j,tab) printf(" ");
  1512. printf("%4d: %s [%s]\n",i,str[i].c_str(),strtype[i].c_str());
  1513. if(nxt[i]>=0) nxtlst[nxt[i]]->debug_writer(tab+4);
  1514. }
  1515. }
  1516.  
  1517. void output_vardef(int mode, int tab){
  1518. int i, f;
  1519. std::set<string> tp;
  1520. std::set<string>::iterator it;
  1521. vector<string> tmp;
  1522. map<string,string>::iterator mt;
  1523.  
  1524. for(mt=localvar.begin(); mt!=localvar.end(); mt++){
  1525. tmp = split_p2(mt->second, ',');
  1526. assert(tmp.size()==4);
  1527. tp.insert(tmp[0]);
  1528. }
  1529. for(it=tp.begin(); it!=tp.end(); it++){
  1530. rep(i,tab) printf(" ");
  1531. f = 0;
  1532. for(mt=localvar.begin(); mt!=localvar.end(); mt++){
  1533. tmp = split_p2(mt->second, ',');
  1534. assert(tmp.size()==4);
  1535. if(*it == tmp[0]){
  1536. if(f) printf(", ");
  1537. else printf("%s ", it->c_str());
  1538. f++;
  1539. printf("%s%s%s", tmp[1].c_str(), mt->first.c_str(), tmp[2].c_str());
  1540. if(tmp[3].size() != 0) printf("=%s",tmp[3].c_str());
  1541. }
  1542. }
  1543. printf(";\n");
  1544. }
  1545. }
  1546.  
  1547. void output(int mode, int tab = 0){
  1548. int i, j;
  1549. int var = 0;
  1550. string s;
  1551.  
  1552. rep(i,str.size()){
  1553. if(strtype[i]=="sentence-var-def") continue;
  1554.  
  1555. if(var==0 && (type != "program" || strtype[i] != "block-inserted")){
  1556. var = 1;
  1557. output_vardef(mode, tab);
  1558. }
  1559.  
  1560. if(strtype[i]=="block-inserted"){
  1561. nxtlst[nxt[i]]->output(mode, tab);
  1562. continue;
  1563. }
  1564.  
  1565. rep(j,tab) printf(" ");
  1566. s = str[i];
  1567. if(g_flags.count((string)"no-unlocked")) replaceAll_t(s, "putchar_unlocked", "putchar");
  1568. if(g_flags.count((string)"no-unlocked")) replaceAll_t(s, "getchar_unlocked", "getchar");
  1569. printf("%s",s.c_str());
  1570.  
  1571. if(strtype[i].substr(0,5)=="block"){
  1572. printf("{\n");
  1573. } else {
  1574. printf("\n");
  1575. }
  1576. if(nxt[i]>=0) nxtlst[nxt[i]]->output(mode, tab+(mode==0?2:0));
  1577. if(strtype[i].substr(0,5)=="block"){
  1578. rep(j,tab) printf(" ");
  1579. printf("}\n");
  1580. }
  1581. }
  1582. }
  1583. };
  1584.  
  1585. int main(){
  1586. int i, j, k, f;
  1587. char buf[10001];
  1588. string str, str_store;
  1589.  
  1590. for(;;){
  1591. k = fread(buf, 1, 10000, stdin);
  1592. buf[k] = '\0';
  1593. str += buf;
  1594. if(k < 10000) break;
  1595. }
  1596. str_store = str;
  1597.  
  1598. ifun.set();
  1599. string tmp;
  1600.  
  1601. code c;
  1602. c.up = NULL;
  1603. c.set(str, (string)"program");
  1604.  
  1605. tmp = ifun.get_insert_string();
  1606. c.insert(tmp, 0);
  1607.  
  1608. // c.debug_writer();
  1609. c.output(0);
  1610. printf("// cLay varsion 20170408-3\n");
  1611.  
  1612.  
  1613. str = str_store;
  1614. f = 0;
  1615. printf("\n// --- original code ---\n");
  1616. rep(i,str.size()){
  1617. if(!f) printf("// "), f = 1;
  1618. if(str[i]=='\r') continue;
  1619. putchar(str[i]);
  1620. if(str[i]=='\n') f = 0;
  1621. }
  1622.  
  1623. return 0;
  1624. }
  1625.  
Success #stdin #stdout 0.01s 32080KB
stdin
{
  int test = 0, TEST;
  rd(TEST);
  while(TEST--){
    printf("Case #%d: ", ++test);
    fprintf(stderr, "r=%d\n", TEST);

    int K;
    char S[1111];

    int i, c, n, r = 0;

    rd(S, K);
    n = strlen(S);

    S[0..n-1] = (S[0..]=='-')?0:1;
    rep(i,n-K+1) if(S[i]==0) S[i..i+K-1] ^= 1, r++;

    c = 0;
    rep(i,n) c += S[i];
    if(c==n) wt(r); else wt("IMPOSSIBLE");
  }
}
stdout
#include<bits/stdc++.h>
using namespace std;
void rd(int &x){
  int k, m=0;
  x=0;
  for(;;){
    k = getchar_unlocked();
    if(k=='-'){
      m=1;
      break;
    }
    if('0'<=k&&k<='9'){
      x=k-'0';
      break;
    }
  }
  for(;;){
    k = getchar_unlocked();
    if(k<'0'||k>'9'){
      break;
    }
    x=x*10+k-'0';
  }
  if(m){
    x=-x;
  }
}
void rd(char c[]){
  int i, sz=0;
  for(;;){
    i = getchar_unlocked();
    if(i!=' '&&i!='\n'&&i!='\r'&&i!='\t'&&i!=EOF){
      break;
    }
  }
  c[sz++] = i;
  for(;;){
    i = getchar_unlocked();
    if(i==' '||i=='\n'||i=='\r'||i=='\t'||i==EOF){
      break;
    }
    c[sz++] = i;
  }
  c[sz]='\0';
}
void wt_L(int x){
  char f[10];
  int m=0, s=0;
  if(x<0){
    m=1;
    x=-x;
  }
  while(x){
    f[s++]=x%10;
    x/=10;
  }
  if(!s){
    f[s++]=0;
  }
  if(m){
    putchar_unlocked('-');
  }
  while(s--){
    putchar_unlocked(f[s]+'0');
  }
}
void wt_L(const char c[]){
  int i=0;
  for(i=0;c[i]!='\0';i++){
    putchar_unlocked(c[i]);
  }
}
int main(){
  int TEST, test=0;
  rd(TEST);
  while(TEST--){
    char S[1111];
    int K, c, i, n, r=0;
    printf("Case #%d: ", ++test);
    fprintf(stderr, "r=%d\n", TEST);
    rd(S);
    rd(K);
    n = strlen(S);
    {
      int Nzj9Y0kE;
      for(Nzj9Y0kE= 0;Nzj9Y0kE< (n-1) + 1;Nzj9Y0kE++){
        S[Nzj9Y0kE] = (S[Nzj9Y0kE]=='-')?0:1;
      }
    }
    for(i=0;i<n-K+1;i++){
      if(S[i]==0){
        {
          int bkxOPzPX;
          for(bkxOPzPX= i;bkxOPzPX< (i+K-1) + 1;bkxOPzPX++){
            S[bkxOPzPX] ^= 1;
          }
        }
        r++;
      }
    }
    c = 0;
    for(i=0;i<n;i++){
      c += S[i];
    }
    if(c==n){
      wt_L(r);
      putchar_unlocked('\n');
    }
    else{
      wt_L("IMPOSSIBLE");
      putchar_unlocked('\n');
    }
  }
  return 0;
}
// cLay varsion 20170408-3

// --- original code ---
// {
//   int test = 0, TEST;
//   rd(TEST);
//   while(TEST--){
//     printf("Case #%d: ", ++test);
//     fprintf(stderr, "r=%d\n", TEST);
// 
//     int K;
//     char S[1111];
// 
//     int i, c, n, r = 0;
// 
//     rd(S, K);
//     n = strlen(S);
// 
//     S[0..n-1] = (S[0..]=='-')?0:1;
//     rep(i,n-K+1) if(S[i]==0) S[i..i+K-1] ^= 1, r++;
// 
//     c = 0;
//     rep(i,n) c += S[i];
//     if(c==n) wt(r); else wt("IMPOSSIBLE");
//   }
// }