ACM

ACM,algorithm

小别

最…

太阳一朝升起,一夕落下.大学的最后一次新年就这么来了
回头看看去年今日在实验室写的文章,要是没有小妞的出现,这一年可能几乎都没办法留下什么.

既然是年度总结,就写点这一年中当时在想的事情吧
一月:忘了
二月:忘了
三月:忘了
四月:忘了
五月:finals
六月:忘了
七月:忘了
八月:忘了
九月:校招
十月:小妞
十一月:小妞
十二月:小妞
更多 >

Popularity: 4% [?]

合影

当我跑步的时候,我在想些什么

“Pain is inevitable.Suffering is optional.”
这句话据说是一个马拉松运动员跑步时激励自己候念的魔咒.
42.195公里,心里不想着形形色色的情况,怕是没办法坚持下来.
我跑完之后回忆了一下我心中想的最多的一个词或者是一句话…
结果很让我羞愧,我这粗俗的人心中默念最多的话就是”fuck”了吧,好在这句咒语起了作用让我坚持了下来

0km:
好多人啊.挤的密密麻麻的,还不时有跑友互相打招呼,好不热闹
我们学校真拉轰,跑马拉松还扛着个旗子跑有木有.
人家扛着旗子跑,我空手跑怎么说也得跟上.
好的,目标就是跟着旗子跑了

5km:
速度还不错,跟着大部队,也不气喘,也不吃力,感觉还能加速
听到周围发出”哇,跑全程还背着旗”,”哇,竟然是杭电的”,”我们也不能输”的唏嘘声
这么光荣的事怎么得我也得掺上一把
我得主动请缨,也抗上一段路

10km:
把旗子交出去之后,仿佛力气也随之流失,加上一个上坡,怎么觉得跑不动了,唉,撑到下一站喝下运动饮料应该会好点吧
补给站到了,没想到停下来喝了口饮料,和旗子就已经相差50m了
看着前面旗子飘扬,真想赶上啊,可是不管我怎么提速,旗子怎么就越来越远呢?
啊,又过了一个上坡,一个拐弯,旗子看不见了.

15km:
膝盖好疼,一定是平时训练少了
感觉马拉松发的衣服好刺人,胸口刺刺的,耍流氓就耍流氓吧,脱光了跑
咦,刚刚那超过的我小巧姑娘竟然这么能跑,怎么说也不能输给一个看上去这么较弱的姑娘啊
如果当时你在场,就会发现这么一幕:一个几乎裸体的猥琐男追着一个清纯的姑娘在跑.

20km:
那姑娘在进了一条隧道之后就跟丢了,顿时觉得前途一片黑暗
大腿根部抽筋好痛,保持不住了,我要停下来走走,这里人这么多,还是等等到没什么人的地方停下来休息吧
2公里的折返点遇到了扛旗大队,叫我慢慢跑
悲剧,已经被他们拉出了这么远了
时限4小时的气球兔子(跑步期间有MM带着兔子的发卡,身后吊着个气球,帮助大家掌握各个时限)带着一帮人从我身边华丽而过,要是能保持之前的速度,说不准可以在4小时内跑到呢,可怜现在我只能无奈着看着这波人消失在视野中
前面是一个医疗站,我去问一下有木有止痛剂或者麻醉剂,想注射一针让我能做机械运动
可恶,刚刚那个医生说只接收伤员

25km:
如今只能走100m,做几个活络胫骨的运动然后跑500m,而且这跑近乎于步行.
妈的,刚刚收容的放弃人员的车子竟然向我鸣笛,示意我上车,我竟然已经搓到这个地步了
TMD我要是上车我就不是胡浩,腿抽得废了也不上车
又被两个一起出发的朋友超过.
路边一老汉正在用一支奇怪的喷雾剂,不管怎么样,借来用一下吧,希望能有效果

30km:
喷雾剂竟然起效果了,大腿不抽筋,又能跑了.
一个外国MM听着nano6从我身边一瘸一拐的缓慢跑过.
要是我的nano6修好了估计也可以这么一边听音乐一边跑吧
于是我不要脸的用我那蹩脚我英语上前说我们一起跑吧.MM爽快的答应了
可惜跑步的时候光顾着喘气了,都没力气交流
就这样,我们两个人像蜗牛一样走走停停.
期间遇到了到阿里的补给站,很大方的递过来两瓶佳得乐
结果MM说不要,于是我很尴尬的一手一瓶没开的佳得乐,拖着残腿的双腿,一路蹒跚着(跑了两公里后交给了路旁的志愿者)

35km:
时限5小时的气球兔子在我们休息的时候从身边跑过.
跑步过程中我才知道原来跑马拉松是有时间限制的,超过5小时就没有证书云云…
为了这5个小时留下点纪念的东西,不得不咬着牙着这最后的期限跑.
这个时候我的腿又抽了,但是不管怎么样,都得跑了,不然5个小时没跑到脸就丢大了.
但是国外的那个MM在一个补给点停下来喝水了,后来没有跟上,可惜啊,连最简单的”I’m HuHao,what’s your name”都没交流上.
气球兔子说他跑到的时间大概是4h58m,身后400m开外的人已经没有希望了,我连回头看的力气都没有,怕一回头身体就失去了平衡或者停下脚步,完全是机械运动
好饿啊.跑完一定要好好吃一顿!

41km:
遇到了我们学校一起的张键,他在30km的时候超过了我,眼看现在他就要被气球兔子耍在身后了,给他鼓劲叫他跟上
庆幸的是他最终以”4h59m59s”的成绩完成了比赛,成为这次马拉松最幸运的人,他那证书太给力了,早知道我也在终点前停一会,等最后一秒再迈过去

42km:
最后想来个华丽丽的冲刺,结果发现脚已经麻木,只能维持原速.恐怕一停下来就没力气再向前迈一步了

终点:
终于有吃的了,我从来没有像现在这么饿,接到食物不管怎么的,随便挨着个东西就坐倒在地上一顿猛吃,吃完后还不要脸问志愿者再要了一份…

虽然一直认为马拉松这玩意又不是技术活,只要咬着牙,只要够不要命,够自不量力,不管谁都能做到
但是这次在半途就抽筋的情况下还坚持跑完,我都不得不佩服一下自己了.
别人说跑全程需要准备三个月,我才准备了20天,累计跑步70km.实在太勉强了
持续跑步,没事就去跑个20,30圈,来年再战



Popularity: 6% [?]

如果你是ACMer,你会选择哪个职业?

下午受ACM-DIY群里的大神们的启发YY了一套ACMer的技能.
以下十个职业参照WoW.如果你是ACMer,你会选择哪个职业?

战士:
拦截:阻止对方一个AC.
战斗怒吼:友方程序效率提高100%,持续10分钟
断筋:使对方无法提交,持续20分钟
雷霆一击:周围目标程序效率降低99%,持续10分钟
致死打击:过了80%数据就算AC
缴械:没收敌人键盘,持续20分钟
嘲讽:所有人都不断提交你刚刚提交的题,持续1分钟

更多 >

Popularity: 15% [?]

2011阿里巴巴程序设计公开赛

暑假开始,lcy老师叫我准备出套题,我盘算着在退役之前来场华丽的专场,想也没想就答应了
不过一个人出题压力真大啊….难易程度,各种题型,都要把握好.关键是还没有基友可以一起验题..
idea是早就想好了几道,但是题是等到Astar回来之后才开始出的…
由于个人喜欢玩游戏,所以出了场以游戏为背景的游戏专场..希望各位玩的开心
还好在比赛前夕赶出来,由于人手不是很多,比赛的时候还是出现了很多瑕疵,够华丽但是不够圆满啊..
更多 >

Popularity: 17% [?]

【完全版】线段树

很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉得当时的代码风格实在是太丑了,很多线段树的初学者可能就是看着这篇文章来练习的,如果不小心被我培养出了这么糟糕的风格,实在是过意不去,正好过几天又要给集训队讲解线段树,所以决定把这些题目重新写一遍,顺便把近年我接触到的一些新题更新上去~;并且学习了splay等更高级的数据结构后对线段树的体会有更深了一层,线段树的写法也就比以前飘逸,简洁且方便多了.
更多 >

Popularity: 57% [?]

精彩不亮丽,起落是无常

在去美国的飞机上,看了之前买来一直没看特地留在飞机上看的《伯符》,描绘了小霸王孙策的精彩而不亮丽的一生:江东猛虎孙策17岁丧父,10年建以其惊人的速度打下江东,开创大业,成为当时最年轻的强大军阀之一,最后却在形势一片大好的情况下命陨于吉之手。
“精彩不亮丽,起落是无常”成为了他这一生的总结。想不到这句话恰恰也成了我ACM-ICPC最后一场比赛的总结。

随着Poucher幽默发言和倒计时的结束,2011 World Finals开始了,我找了道题目描述最短的E题开读,了解题意后马上想出解法,坐标旋转45度后做二维区间统计,数据量正好合适,可搞。于是我开始coding,同时叫小丽帮忙推出坐标转化函数,边界情况RE一次后得到了全场第一个E的气球。这感觉有点梦幻,虽然平时刷水题的速度是挺快的,但是在全世界高手云集的情况下拿到first blood还是从来没有想过,加上赛前知道第一个AC某道题目的队伍能拿到1050$。很开心的和工作人员合影,这大概是我这次旅途最开心的一张照片。
之后开了很多队伍过了的C,J,K。
K题很简单,凸包后做简单枚举,1Y。
J题是背包,但是要输出方案,提交WA后先放一边。
C题识别图像,抓住有几个“洞”这特征后非常简单,2Y。
这时候感觉时间才过了不久,已经是3题并且有一题的代码找出bug后就能AC了,形势一片大好,很少有一场比赛有这么顺利过。
想到刘汝佳赛前和我说的finals的题往往要集两三人的智慧才能找到bug,于是我决定小丽和我一起debug。确实找到了一些bug,并且每次在修改提交前都感觉能AC了,点submit的手都有点激动的发抖,但是返回Wrong Answer的结果瞬间给我泼了冷水。在尝试N次且没有新思路和反例后,小丽想到了A的大致解法,我想了一遍觉得可行,但是看答案竟然和J一样是要输出最小字典序的方案,两小时debug无果的经历使我非常痛苦。现在的情形已经不容我犹豫,coding完A的代码后竟然直接就出了sample和自己造的一些例子,这种题通常都要debug一会才能出例子,小丽都在边上叫“哇,这么顺利,瞬出sample,有不祥的预感”。果然返回的Wrong Answer印证了不祥的预感,剩下的半个多小时在我们非常痛苦的debug中一点一点流逝了。

这次finals我的目标是不留一点遗憾,但这场比赛留给我的遗憾比以往任何一场都大。完美的开局,惨淡的结局。
今年和去年的finals题差好多,去年的中等题想到解法就能AC,今年的却不是考想法,而是trick,可能这才是正常的finals吧。赛后有一段时间一直在抱怨这类题目,工作中的bug至少还知道bug的一些特征,只要让我知道了bug在哪一定可以马上搞定。可惜抱怨没用,竞赛就是竞赛,哪怕只是一点点的错误,最后导致的结果也是天差地别。

一直想找种观念来排解内心的苦闷,前段时间看《圣经》里的《传道书》,里边的虚空论虽然可以排解人生一切苦闷,但是我却还没所罗门王得那种能看开一切的智慧。后来刘汝佳在GTalk上给我留言说有这种经历也是好的,我听了后渐渐释怀了,这场finals并不是终点,仅仅是我漫长道路上的一段小经历,并非没达到期望天就塌下来了,太阳还是照常升起,我的旅途也刚刚开始。这段经历没能让我旅途的起点足够高,却给我了旅途中更重要的智慧,因为每次痛苦过后就是成长。

我的ACM-ICPC的生涯以及最后一场比赛都是那么的精彩,但不亮丽,起落,却是无常。

接触计算机编程到第一次参加World Finals仅一年时间,精彩么?
最后一场比赛成为最遗憾的一场比赛,无常么?
哈~

Popularity: 17% [?]

省赛夺杯图

省赛

大一:初生牛犊,结果意外夺金
大二:信心满满,结果银牌悲剧
大三:一片空白,结果惊人捧杯
(大四:纯属酱油,要是铜牌收尾的话真的就集齐铜/银/金/杯圆满了~哈哈)
更多 >

Popularity: 19% [?]

【完全版】插头DP

以前写过一篇关于插头DP的文章
只浅浅的研究了最最基础的几个类型:多条回路,一条回路,简单路径
当时局限于括号表示法,死活无法继续研究更深层次的:广义路径
后来厚着脸皮问陈丹琦要了uva Black and White的代码,研读数遍之后”大彻大悟”,脱离了括号表示法,用最小表示法效率同样很高,并且操作非常方便.即便是最最复杂的情况用最小表示法也可以方便的表示
更多 >

Popularity: 29% [?]

ZOJ Monthly, January 2011小结

回家后就堕落了,没能在家里宅满一整天,天天出去玩,只做了一场TC,而且还扣分了(本来接近的红又越来越远,欲哭无泪啊).
11点半被叫醒,本来今天也不会做的,说好了和一个MM到外边骑马去,午饭都还没来得及吃,和晓立打了声招呼说不做了,不过匆匆扫了一眼题目发现竟然有一道插头DP,而且还是非常规六边形的.我去,当时我就想这道题除了我之外世上还有多少人能在比赛的时候AC它啊(容老衲自恋一番,捏哈哈哈哈哈哈),内心十分矛盾,一方面是和MM的约会,一方面是彰显我插头功底的时候.当时心内还是准备和MM出去玩的>_<
好在这的时候MM打电话过来说那个骑马场过年关门了,要到年后才能开,一个外在的因素让我不用做抉择使得我如释重负.

于是开始做这次的月赛:
J:首先在刷牙洗脸上厕所的时候想了想这六边形的独特之处:有六个边,不过和常规的一样只能有两个度.
好在这题的宽是确定的8,不过却是左边对齐,而不是上边对齐,而长度可能会有10,这又显的稍稍麻烦一点
在纸上画了画(家里笔和纸都没,翻了半天找到小学时候的作业本的铅笔,好在一样好用^_^),发现轮廓线都会变,OMG,这么神奇.
0246列的时候轮廓线只有15个单位,到1357就变成了17个单位,并且是从中间多出来的,不好搞不好搞…

并且0246的时候只有两个已知插头,1357有四个(关键就是那多出来的两个).
于是细心分解后把插头的对应转移关系理清楚,我多设置了两个bit来保持多出来的轮廓,万事准备OK,开始coding.
足足敲了250行,差不多是我写过的插头里边短时间敲出来的最长的代码了,主要是奇偶列还要分出来写,情况还真的是很多.
好在sample给的还算和谐,没有给超级简单没用的sample,还是让我找到了很多个编码时的bug.自己出了几个验证性sample也过了,提交结果是WA,修改了几个漏洞之后发现题目竟然还读错了,多加了一个条件(圈的长度要大于3,题目说的是至少是3,但是小于3也够不成圈啊)我还为这条件想了好久,加了好多个判断,于是反斜杠反斜杠,终于返回了一个期待N久的Accept,哇靠,那敢情,比进finals了还激动..

接下去就正常了,晓立已经把H和I搞定,我看了下过的人最多的D,推敲一下是网络流(小菊花在吃年夜饭,我好久没搞网络流,不过也只好我自己上了),由于笔记本没装dropbox,叫晓立那边仍个模板过来,结果网络流模板太多,丢了好几个才丢中,边界RE TLE了几次后也顺利过了.
接着A过的人比较多,一看就是打表的题,于是马上叫晓立写个暴力的,我去看G,属于比较简单的DP,手指5和9那里的关系(当时我就想不通为什么5个手指可以按9个键=.=)搞了一会后出sample就1A了,晓立接着也搞定了A
还剩15分钟,挣扎着看了一下B,和小丽讨论一下发现没希望了….后来AC大牛说我们OJ有个简化版的(当时还是他教天涯的,而我又是请教天涯的,当时印象中他和我说了两个方法,我就记得一个特殊的递推的方法.残念)

哈哈,今天做出了J题还是蛮开心的,虽然没能和MM出去玩T^T,晚上出去找朋友逛去,坚决不再家里宅一整天时间
附上J题代码(算是插头的一个模板,本来想寒假整理的,不过资源全在实验室电脑里没带回家,还是等回去再发完全版插头dp好了,有兴趣的可以先研究下下面代码):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#include <cstdio>
#include <string>
#include <algorithm>
#include <cstring>
using namespace std;
 
#define LL long long
int n , m = 8;
bool maze[11][9];
 
const int HashSize = 300007;
struct HashMap {
	int HashChart[HashSize] , sz;
	int MSK[HashSize];
	bool A[HashSize];
	bool B[HashSize];
	LL dp[HashSize];
	int next[HashSize];
	void clear() {
		sz = 0;
		memset(HashChart, -1, sizeof(int) * HashSize);
	}
	inline void push(int msk, bool a, bool b,LL val) {
		int x = (msk * 4 + a * 2 + b) % HashSize;
		for (int it = HashChart[x] ; it != -1 ; it = next[it]) {
			if (MSK[it] == msk && A[it] == a && B[it] == b) {
				dp[it] += val;
				return ;
			}
		}
		MSK[sz] = msk;
		dp[sz] = val;
		A[sz] = a;
		B[sz] = b;
		next[sz] = HashChart[x];
		HashChart[x] = sz ++;
	}
} HM[2];
HashMap *src = HM;
HashMap *des = HM + 1;
 
LL plugDP() {
	src->clear();
	src->push(0,0,0,1);
	for (int i = 0 ; i < n ; i ++) {
		for (int j = 0 ; j < m ; j ++) {
			des->clear();
			for (int k = 0 ; k < src->sz ; k ++) {
				int msk = src->MSK[k];
				LL val = src->dp[k];
				bool a = src->A[k];
				bool b = src->B[k];
				//printf("%d %d %d %d {",i,j,a,b);
				//for (int it = 0 ; it < 15 ; it ++) {
				//	printf("%d ",(msk >> it) & 1);
				//}
				//puts("}");
				if (j & 1) {
					bool p = ((msk >> (j*2)) & 1);
					bool q = (j == m - 1) ? false : ((msk >> (j*2+1)) & 1);
					int cnt = 0;
					if (p) cnt ++;
					if (q) cnt ++;
					if (a) cnt ++;
					if (b) cnt ++;
					if (maze[i][j] == true) {
						if (cnt == 0) {
							msk &= ~(1 << (j*2));
							msk &= ~(1 << (j*2+1));
							des->push(msk , false , false , val);
						}
						continue;
					}
					if (cnt > 2) continue;
					if (cnt == 2) {
						msk &= ~(1 << (j*2));
						msk &= ~(1 << (j*2+1));
						des->push(msk , false , false , val);
					} else if (cnt == 1) {
						//1
						int nmsk = msk;
						if (i != n - 1 && !maze[i+1][j]) {
			//				if (b && ((msk>>(j*2-1)) & 1))continue;//length 3
							nmsk |= (1 << (j*2));
							nmsk &= ~(1 << (j*2+1));
							des->push(nmsk , false , false , val);
						}
						//2
						if (j != m - 1 && !maze[i][j+1]) {
			//				if (q && ((msk>>(j*2+2)) & 1)) continue;//length 3
							msk &= ~(1 << (j*2));
							msk |= (1 << (j*2+1));
							des->push(msk , false , false , val);
						}
					} else if (cnt == 0) {
						if (j != m - 1 && i != n - 1 && !maze[i+1][j] && !maze[i][j+1]) {
							msk |= (1 << (j*2));
							msk |= (1 << (j*2+1));
							des->push(msk , false , false , val);
						}
					}
				} else {
					bool p = (j == 0) ? 0 : ((msk >> (j*2-1)) & 1);
					bool q = ((msk >> (j*2)) & 1);
					a = ((msk >> (j*2+1)) & 1);
					if (maze[i][j]) {
						if (!p && !q) {
							b = false;
							msk &= ~(1 << (j*2));
							msk &= ~(1 << (j*2+1));
							if (j) msk &= ~(1 << (j*2-1));
							des->push(msk , a , b , val);
						}
						continue;
					}
					if (p && q) {
						b = false;
						msk &= ~(1 << (j*2));
						msk &= ~(1 << (j*2+1));
						if (j) msk &= ~(1 << (j*2-1));
						des->push(msk,a,b,val);
					} else if (p || q) {
						//1
						int nmsk = msk;
						if (!maze[i][j+1]) {
			//				if (q && a) continue; //length 3
							b = true;
							nmsk &= ~(1 << (j*2));
							nmsk &= ~(1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						if (i == n - 1) continue;
						//2
						if (!maze[i+1][j]) {
							nmsk = msk;
							b = false;
							nmsk |= (1 << (j*2));
							nmsk &= ~(1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						//3
						if (!maze[i+1][j+1]) {
							nmsk = msk;
							b = false;
							nmsk &= ~(1 << (j*2));
							nmsk |= (1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						//4
						if (j && !maze[i+1][j-1]) {
			//				if (p && ((msk >> (j*2-2)) & 1)) continue;//length 3
							nmsk = msk;
							b = false;
							nmsk |= (1 << (j*2-1));
							nmsk &= ~(1 << (j*2));
							nmsk &= ~(1 << (j*2+1));
							des->push(nmsk , a , b , val);
						}
					} else {
						if (i == n - 1) continue;
						//1
						int nmsk = msk;
						if (!maze[i][j+1] && !maze[i+1][j]) {
							b = true;
							nmsk |= (1 << (j*2));
							nmsk &= ~(1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						//2
						if (!maze[i+1][j+1] && !maze[i+1][j]) {
							nmsk = msk;
							b = false;
							nmsk |= (1 << (j*2));
							nmsk |= (1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						//3
						if (!maze[i+1][j+1] && !maze[i][j+1]) {
							nmsk = msk;
							b = true;
							nmsk &= ~(1 << (j*2));
							nmsk |= (1 << (j*2+1));
							if (j) nmsk &= ~(1 << (j*2-1));
							des->push(nmsk , a , b , val);
						}
						if (j && !maze[i+1][j-1]) {
							//4
							if (!maze[i][j+1]) {
								nmsk = msk;
								b = true;
								nmsk &= ~(1 << (j*2));
								nmsk &= ~(1 << (j*2+1));
								nmsk |= (1 << (j*2-1));
								des->push(nmsk , a , b , val);
							}
							//5
							if (!maze[i+1][j]) {
								nmsk = msk;
								b = false;
								nmsk |= (1 << (j*2));
								nmsk &= ~(1 << (j*2+1));
								nmsk |= (1 << (j*2-1));
								des->push(nmsk , a , b , val);
							}
							//6
							if (!maze[i+1][j+1]) {
								nmsk = msk;
								b = false;
								nmsk &= ~(1 << (j*2));
								nmsk |= (1 << (j*2+1));
								nmsk |= (1 << (j*2-1));
								des->push(nmsk , a , b , val);
							}
						}
					}
				}
			}
			swap(src,des);
		}
	}
	for (int i =0 ; i < src->sz ; i ++) {
		if (src->MSK[i] == 0 && src->A[i] == false && src->B[i] == false) return src->dp[i];
	}
	return 0;
}
int main() {
	int m;
	while (~scanf("%d%d",&n,&m)) {
		memset(maze , false , sizeof(maze));
		for (int i = 0 ; i < m ; i ++) {
			char str[3];
			scanf("%s",str);
			maze[ str[0] - 'A' ][ str[1] - 'A' ] = true;
		}
		printf("%lld\n",plugDP());
	}
	return 0;
}
/*
2 12
AC BC
AD BD
AE BE
AF BF
AG BG
AH BH
2 13
AB
AC BC
AD BD
AE BE
AF BF
AG BG
AH BH
3 7
BB AD BD CD BF AH CG
3 15
AA BA CA
AB BB CB
AC BC CC
AD BD CD 
BF AH CG
3 16
BB 
AD BD CD
AE BE CE
AF BF CF
AG BG CG
AH BH CH
*/

Popularity: 16% [?]

[zz]让IT人士远离慢性疲劳

F.M.L. 11个文中所说的非理性思维全部出现,需要好好”自”疗下了=.=
导语:我们都不得不承认这样的一个事实:我们很累。快节奏的生活迫使我们把体力和精力都用到了极限,慢性疲劳淹没了我们。在所有来访的职场人当中,IT行业的从业人员无疑是慢性疲劳症状最为明显的一部分人群。面对这样的情况,考虑IT行业的工作特性,听心推荐大家试一试认知行为疗法吧,在战胜疲劳的诸多方法里,它的效果非常不错,又可以独立完成。
更多 >

Popularity: 16% [?]