[C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ

前言

  做过杭电、浙大或是北大等ACM题库的人一定对“刷题”不陌生,以杭电OJ为例:首先打开首页(http://acm.hdu.edu.cn/),然后登陆,接着找到“Online Exercise”下的“Problem Archive”,然后从众多题目中选择一个进行读题、构思、编程、然后提交、最后查看题解状态,如果AC了表示这一题被攻克了,否则就要重做了~一般情况下,“刷题”要求精神高度集中且经验丰富,否则很难成功AC,有时候甚至做一题要浪费半天的时间!(有时网速卡了,比抢火车票还要急!)

  楼主在这里先给广大辛勤“刷题”的ACMer赔个不是,因为本文所介绍的AC自动机其实是利用爬虫从网上搜索题目答案,然后再利用C#的web控件和鼠标、键盘事件来自动提交题目的投机式机器人(纯属楼主自娱自乐,多多见谅!)。

注:下图依次是①主页面;②题目列表页面;③题目页面;④提交代码页面;⑤提交结果查看页面

     

成果

  参看杭电OJ的RankList(http://acm.hdu.edu.cn/ranklist.php),目前我用这个AC自动机粗略的刷一遍整个题库共提交12391次,解决2688个题目,正确率21.69%,总排名第8。同时我还发现至少2个和我属于同一类的考机器人刷题的“捣蛋鬼”,其中一个是排名第2到第7的三国蜀国的将领们,另一个是几乎占据17~28名的hdujudge0~n。为什么能发现他们?哈哈,①没人会连续几天不停的刷题的;②总提交数高的离谱;③正确率低的吓人;④我在浙大OJ上也遇到了他们(哈哈哈)。在此,我想邀请二位合伙做一个自动爬题+自动分析代码的题库解析的网站,也算是我们利用自己捣蛋的玩具做的一点好事~嘿嘿~(此外,我非常佩服排名第一的那位,如果是人刷的其毅力和能力绝对一流;如果是机器刷的,能达到53.80%的正确率也是非常高明的爬虫!)

业务流程与状态转换机

  其业务流程主要是模拟人在浏览器里的操作过程,从登陆到搜索,从搜索再到提交,从提交再到获取提交状态,如果AC了就转到下一题,如果没有AC就进行第二次尝试(每道题目进行10次尝试),如果中间出现异常就直接进行下一次尝试,来保证程序顺利进行。其整个过程通过下面四个状态变量来控制。状态转换正常情况下发生在webBrowser1_DocumentCompleted以及timer1_Tick事件中,其中前一个事件是每次web文档加载完毕时响应,后一个事件是每隔一定时间响应,此外当代码提取和状态提取的web文档解析线程中如果发生异常,也会触发状态转变。

 1 /// <summary>
 2 /// 0初始状态;1填写用户名和密码状态;2输入找到的代码;3查看是否AC;
 3 /// </summary>
 4 static int input_state = 0;
 5 /// <summary>
 6 /// 0初始状态;1移动鼠标聚焦name和password输入;2移动鼠标聚焦code输入
 7 /// </summary>
 8 int mouse_state = 0;
 9 /// <summary>
10 /// 0初始页面;1登陆页面;2提交代码页面;3查看AC页面
11 /// </summary>
12 int page_state = 0;
13 /// <summary>
14 /// 0初始情况;1已搜索链接;2代码解析中;3代码解析完毕
15 /// </summary>
16 /// <summary>
17 /// 0:初始状态;1:Queuing状态;2:Accepted状态;3:错误状态
18 /// </summary>
19 private static int AC_state = 0;

搜索答案

  本程序的核心部分在于爬代码的爬虫的设计,这里调用百度搜索并从搜索结果中解析相关链接,然后转到对应链接提取答案代码。首先我想到的是一般对ACM题目写解答的地方一般是博客,所以顺手写了个从百度搜索结果获取以http://开头含blog的链接作为目标链接C#代码,用下面的代码顺利找到了杭电1202题的三个可能含有解答代码的链接放在D:\\1.txt中:(下面是搜索结果,前一个链接为代码链接)

[1]http://blog.csdn.net/vsooda/article/details/7989833
[2]http://blog.csdn.net/libin56842/article/details/8798301
[3]http://blog.csdn.net/lulipeng_cpp/article/details/7496022

  但是,很快我发现这并不是一个很好的主意!因为通过解析百度搜索结果的html文件会发现搜索结果一般一次在div id="content_left"内列出10条搜索结果,并且一般给出的链接并不是目标地址的直接链接,值得庆幸的是这10条搜索结果排列整齐,而且非直接链接输入浏览器中会转为相应的目的链接,于是又顺手写了个爬这10个链接的程序:(点击看GitHub中的源码,下面是搜到的结果)

[1]http://www.baidu.com/link?url=2O6LRDmjhJM8xn-Igu5wlgkwq5aZfdxxJ4r3RLoX_AzzJrz0vmi3sWTd96ktLE0hQvzR4ea3ejgVZGPElTh6zq
[2]http://www.baidu.com/link?url=jvZjI4hHOKIzBkclLKizXM6CUHbJrWUIS3RyRUryCDKVjsszzs7bqYh7bTwqt306xZgDsIt7dMjAhG-RcdkpCQY1_UGqbXbd9FS0SEdix0u
[3]http://www.baidu.com/link?url=Wf5w0vIJa319PEwImt7JAqKzbLxLSsR1FP4o6LJIwojMR9xgm3gBVvU6uTkxbgMEhJ6uvj2_aScJaZeJC9sbuz-OV4Vjr_pOS6s9MEhRclC
[4]http://www.baidu.com/link?url=KzVFkFeRcnZbRd9-xQ_pSW-qEG9w49FnNk8pJafCGB5JkCTJVrydtcK9A5TAooIp7Efd1kKkg3pbSi8jdZ-5s9gYaGWRCNPpC0dVqch6aZk265kqqDFaxnAQBi6ShYFh
[5]http://www.baidu.com/link?url=1P-1b_x2MtGF5ixNlsflUcv-qokmPg2U4DCcqVvQ8ZMZXhWCnnWt6DKw9HoOb7dI
[6]http://www.baidu.com/link?url=nVipZInn7U4yAyPtkOZRT6N_FNDi_iqYfihdtBt7OUs3LQ_SZXZQu_PoHEsUG8kDAEQvHCUx4Xw79Bf6YybwHhzp0xBEz-buI19fPDQtXbe
[7]http://www.baidu.com/link?url=Kj82Etn86GRJ19AdR3L3BPJvzlRN1K2Cvv2DrqiNFijbvk3FBTPlpnT8iB2jRYzNXQTLeqGrg7w3KhlYjfYzZxsCU4mJGWD3OZVDjIPGrRC
[8]http://www.baidu.com/link?url=WFNnxqS9m-erR9iBWGUCtWP1neSEOPb_Jzi_Qz1PExLy-scAHVk6DY4d1OslE-5Ns_NsX3bb1_tfgWInj1xngq
[9]http://www.baidu.com/link?url=QV5i9N8Xz7JhakxPGHsxBc8oO1zVcVMsYux105JtFB_hFwUse_9f_CKd1M2ll6vZznLsHNt6RwJvKiL2zU_-sc6MhyxL7iHmxqA9oAMigge
[10]http://www.baidu.com/link?url=1kG1wvoAOwdndtSKIr5wE_1TgoYudR_xyKIRQpPK_kVPhGOKkr-qw3TJ1IcIQ3GV0Cbg7Ye_vvPEh31l2gjzpa

  现在,咱们爬到了链接,那么该如何从杂乱的目标页面中找寻答案代码呢?哈哈,我就不卖关子啦!其实分析众多含有代码的页面可以发现,一般情况下代码是放在body中,而且往往以#include开头(这里只找C或C++写的代码的答案)。所以,根据这个规律我设计了一个首先定位body,然后寻找第一个#include的位置作为代码起始位置,然后找到main,接着根据花括号对称的原理找到代码的结尾位置,从而从html中扣出相应的代码行。(代码请见GitHub,其中op_getCode1(string temp, int num)是新增解析目标html的函数)。下面是10个目标页面中找代码的结果,这里仅列出前5个:

1 没东西

op_getCode2_[1]结果.txt 没有找到

 1 #include<iostream>
 2  2 #include<cstdio>
 3  3 #include<string.h>
 4  4 #define N 1010
 5  5 #define INF 2000000000
 6  6
 7  7 using namespace std;
 8  8
 9  9 int map[N][N],lowcost[N],visited[N],d[N],p[N];
10 10
11 11
12 12 void dijkstra(int s,int n)
13 13 {
14 14     memset(visited,false,sizeof(visited));
15 15     int i,j,k,min;
16 16     for(i=1;i<=n;i++)
17 17     {
18 18         lowcost[i]=map[s][i];
19 19     }
20 20     d[s]=0;
21 21     visited[s]=true;
22 22     for(i=1;i<n;i++)//我又写成 i<=n 了 调试很久!!!
23 23     {
24 24         min=INF;
25 25         for(j=1;j<=n;j++)
26 26         {
27 27             if(!visited[j]&&min>lowcost[j])
28 28             {
29 29                 min=lowcost[j];
30 30                 k=j;
31 31             }
32 32         }
33 33         d[k]=min;
34 34         visited[k]=true;
35 35         for(j=1;j<=n;j++)
36 36         {
37 37             if(!visited[j]&&lowcost[j]>map[k][j]+d[k])
38 38                 lowcost[j]=map[k][j]+d[k];
39 39         }
40 40     }
41 41 }
42 42
43 43 int DFS(int s,int n)
44 44 {
45 45     if(p[s]) return p[s];
46 46     if(s==2)  return 1;
47 47     int i,sum=0;
48 48     for(i=1;i<=n;i++)
49 49     {
50 50         if(map[s][i]<INF&&d[s]>d[i])
51 51         {
52 52             if(p[i]) sum=sum+p[i];
53 53             else sum=sum+DFS(i,n);
54 54         }
55 55     }
56 56     sum=sum+p[s];
57 57     p[s]=sum;
58 58     return p[s];
59 59 }
60 60
61 61 int main()
62 62 {
63 63     int i,j,n,m,u,v,w;
64 64     while(cin>>n&&n)
65 65     {
66 66         cin>>m;
67 67         memset(p,0,sizeof(p));
68 68         for(i=1;i<=n;i++)
69 69         {
70 70             for(j=1;j<=n;j++)
71 71             {
72 72                 map[i][j]=(i==j?0:INF);
73 73             }
74 74         }
75 75         for(i=0;i<m;i++)
76 76         {
77 77             scanf("%d%d%d",&u,&v,&w);
78 78             map[u][v]=map[v][u]=w;
79 79         }
80 80         dijkstra(2,n);
81 81         cout<<DFS(1,n)<<endl;
82 82     }
83 83     return 0;
84 84 }

op_getCode2_[2]结果.txt 找到了,但是没有虑掉代码前的行号!

1 什么也没有

op_getCode2_[3]结果.txt 没有找到

1 #include<iostream>#include<queue>using namespace std;const int inf=10000;int map[1005][1005];int hash[1005][1005];int n,m,p;int x1,y1,x2,y2;int dir[4][2]={-1,0,1,0,0,-1,0,1};typedef struct node{    int x,y,times,direc;    node(){}    node(int xx,int yy,int tt,int ff):x(xx),y(yy),times(tt),direc(ff){}}NODE;bool bfs(){    queue<NODE> q;    NODE temp,tt;    q.push(NODE(x1,y1,0,-1));    hash[x1][y1]=0;    while(!q.empty())    {        temp=q.front();        q.pop();        for(int i=0;i<4;i++)        {             tt.x=temp.x+dir[i][0];             tt.y=temp.y+dir[i][1];             if(temp.direc==-1) {tt.direc=i;tt.times=0;}             else if(i==temp.direc) {tt.direc=temp.direc;tt.times=temp.times;}             else {tt.direc=i;tt.times=temp.times+1;}             if(tt.x>=1&&tt.x<=n&&tt.y>=1&&tt.y<=m&&tt.times<=2&&tt.times<=hash[tt.x][tt.y])             {                   if(map[tt.x][tt.y]==0||(tt.x==x2&&tt.y==y2))                   {                         hash[tt.x][tt.y]=tt.times;                         if(tt.x==x2&&tt.y==y2)                         return true;                           q.push(tt);                   }             }         }    }    return false;}int main(){    while(scanf("%d%d",&n,&m)!=EOF&&(m||n))    {         int i,j;         for(i=1;i<=n;i++)         for(j=1;j<=m;j++)         scanf("%d",&map[i][j]);         scanf("%d",&p);         while(p--)         {              for(i=1;i<=n;i++)              for(j=1;j<=m;j++)              hash[i][j]=inf;              scanf("%d%d%d%d",&x1,&y1,&x2,&y2);              if(map[x1][y1]!=map[x2][y2]||map[x1][y1]==0||(x1==x2&&y1==y2)) printf("NO\n");              else if(bfs()) printf("YES\n");              else printf("NO\n");          }    }    //system("pause");    return 0;}

op_getCode2_[4]结果.txt 找到了,但是没有换行!

 1 #include<stdio.h>
 2
 3 char str[110];
 4
 5 int main()
 6
 7 {
 8
 9  int i;
10
11  while(gets(str))
12
13  {
14
15   for(i=0;str[i];i++)
16
17   {
18
19    if(i==0||(str[i-1]==‘
20 ‘&&str[i]!=‘ ‘))
21
22
23 putchar(str[i]&0xDF);//0x开头的数据是16进制的
24 &是与运算符 c&0xdf是把小写转化为大写
25 x20是把大写转化为小写
26
27
28 else putchar(str[i]);
29
30   }
31
32   putchar(‘\n‘);
33
34  }
35
36  return 0;
37
38 }

op_getCode2_[5]结果.txt 找到了,完整代码

  从上面得到的结果不难看出:虽然存在一些完美的代码,但是有很大一部分需要修改一下也能变成完美代码!然后我综合分析了上述代码存在的情况:①代码行号没去掉;②html的转译符没有转换成标准字符;③CSS样式没有去掉;④没有有效的换行。针对问题②和问题③粗略的写了一个op_getCode2函数来实现代码精化的问题(详细代码请见GitHub),然后将代码精简下,省去不必要的html下载,尝试下解决问题①和问题④(代码中191行,没有换行是因为<br />被我直接删除了),并多添加几个html转译符的转换,结果虽然没有解决问题①,但是搜到的代码正确率已经相当高了~于是就偷下懒,不去解决问题问题①了(嘿嘿,其实解决问题①并不难,只是我不想让程序看着太乱>_<,最终的完美版代码见GitHub

自动登录与自动提交

  进行到这里看似可以大功告成了,其实还差着远呢~我们只是获得了代码,那么该如何自动登录用户并自动提交代码呢?我想到了曾经恶搞的酷我音乐盒(软硬结合第二篇——酷我音乐盒的逆天玩法),在那次我用到了邪恶的模拟鼠标点击事件来戏弄酷我音乐盒,这次我们也要这么干!yes,用程序发送鼠标事件来伪装成人在操作~但是,如果直接在IE、Google或者火狐浏览器里来操作,不就有点在玩弄这些软件的嫌疑嘛,上次恶搞酷我人家没来找我,这次可不一定呀!哈哈,所以俺还得另寻办法~(☆⌒(*^-゜)v开个玩笑,其实是因为考虑到要更好的操控web页面,所以才采用C#的webBrowser控件的)。下面是模拟鼠标点击事件的相关API,当想点击某个位置时只要调用SetCursorPos将鼠标位置设置为相应位置,然后发送一个Down和一个Up消息就完成了一次点击模拟~如果想移动滚动条只要设置位置->Down->设置新位置->Up~

1 private readonly int MOUSEEVENTF_LEFTDOWN = 0x2;
2 private readonly int MOUSEEVENTF_LEFTUP = 0x4;
3 [DllImport("user32")]
4 public static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo);
5 [DllImport("user32.dll", EntryPoint = "SetCursorPos")]
6 private static extern int SetCursorPos(int x, int y);
7 [DllImport("user32.dll")]
8 public static extern bool GetCursorPos(out Point pt);

  可是问题又来了,如果只能用鼠标点点肯定是不能完成复杂的提交代码工作的!于是想到了另一个邪恶的东西:模拟键盘消息~嘻嘻,这次我就能往对应的地方输东西了。 如下:当鼠标将输入聚焦移动到用户名的输入框后,调用SendKeys向对应对话框内输入用户名,然后发送Tab键转至密码输入框,输入密码,最后发送回车,实现登陆!哈哈,怎么样?够不够炫酷呢?用我刚刚介绍的2个邪恶的工具再结合我玩酷我音乐盒时用的获得窗口句柄来控制窗口的手段,大家应能能想到对QQ聊天做点什么邪恶的事啦(是不是想到做一个和别人自动聊天的机器人呢?)

  别得意太早,上面只是我们自以为软件会很听话的SendKeys("A")它就往框里输入A,可实际情况要糟糕的多~因为有输入法的存在,所以在我尝试往提交代码的框里发送code代码时问题就出现了~试一下,当你的系统处于智能中文输入法时,你想在某个框内输入诸如"wos1"时会出现什么效果呢?那么,我们如何来解决这个问题呢?哈哈,我又想到了办法——利用剪切板:我们板code复制到剪切板,然后在对应的代码提交框内只要发送Ctrl+V即可实现代码粘贴(我真是太奸诈啦,哈哈哈哈)

零碎的细节

  到这里基本上已经算完成了,但是一个没有反馈的系统怎么能算智能呢?于是我又对HDU OJ的提交代码后的状态list页面进行解析,找到我的最新提交结果:如果AC了就做下一题,如果正在测试就再次刷新一遍知道有确定结果,如果错了就尝试下一个链接,直到10个链接全部试完转到下一题。这里要特别说明下,由于html下载与解析会造成长延时,如果放在主线程中去做会导致程序一卡一卡的,于是我将isAccept函数和另外两个分别用于找10个链接的函数operator0、对某一个链接的目标页面进行解析提取代码的函数op_getCode1分别采用线程异步计算,这里和上面实验过程中采用的主线程中直接处理有不同,要稍微注意下。更多请看详细代码:https://github.com/beautifulzzzz/C4plus/tree/master/hdu_AC自动机

 1 private static void isAccept(object obj)
 2 {
 3     try
 4     {
 5         html = html.Substring(html.IndexOf("table_text"));
 6         html = html.Substring(html.IndexOf("table_header"));
 7         html = html.Substring(html.IndexOf("center") + 5);
 8         for (int i = 0; i < 15; i++)
 9         {
10             html = html.Substring(html.IndexOf("center") + 5);
11             string temp = html.Substring(0, html.IndexOf("</tr>"));
12             int find1 = temp.LastIndexOf("userstatus.php?user=") + 20;
13             int length1 = temp.Substring(find1).IndexOf(‘"‘);
14             int find2 = temp.IndexOf("font color=") + 11;
15             int length2 = 0;
16             while (find2 < temp.Length && temp[find2] != ‘>‘) find2++;
17             find2++;
18             while (find2 + length2 < temp.Length && temp[find2 + length2] != ‘<‘) length2++;
19             string user = temp.Substring(find1, length1);
20             string state = temp.Substring(find2, length2);
21             show += "user : " + user + "\r\n";
22             show += "state: " + state + "\r\n";
23             if (user.Equals("beautifulzzzz1"))
24             {
25                 if (state.Equals("Queuing") || state.Equals("Compiling") || state.Equals("Running"))
26                 {
27                     AC_state = 1;
28                 }
29                 else if (state.Equals("Accepted"))
30                 {
31                     AC_state = 2;
32                 }
33                 else
34                 {
35                     AC_state = 3;
36                 }
37                 break;
38             }
39             //show += temp + "\r\n";
40         }
41     }
42     catch(Exception e)
43     {
44         input_state = 3;
45         search_state = 2;
46         AC_state = 3;
47     }
48 }

后记

  这几天忙着准备2015实习面试,所以也没太多时间研究这些好玩的东西啦~谨以此篇博客证明我还活着,哈哈!其实楼主脑子里还有很多炫酷的事,比如让机器自编程、让一些低级CPU学会交流与联合、在全网内养殖虚拟机器人控制舆论...不过,这都要放放,首先得解决温饱问题,不然注定孤独寂寞冷呀~

相关链接

HDU AC自动机最终工程:https://github.com/beautifulzzzz/C4plus/tree/master/hdu_AC自动机

HDU AC自动机实验版(要会用Github看历史版本!):https://github.com/beautifulzzzz/C4plus/tree/master/爬虫

时间: 2024-10-27 05:51:01

[C#] 逆袭——自制日刷千题的AC自动机攻克HDU OJ的相关文章

【AC自动机】HDU中模板题汇总(待更新)

[HDU2222] 最纯粹的裸题,错误点详见注释. 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<queue> 6 using namespace std; 7 struct ACauto 8 { 9 int sum; 10 ACauto* next[26]; 11 ACauto* fail; 12 ACau

HDU 5880 Family View (2016 青岛网络赛 C题,AC自动机)

题目链接  2016 青岛网络赛  Problem C 题意  给出一些敏感词,和一篇文章.现在要屏蔽这篇文章中所有出现过的敏感词,屏蔽掉的用$'*'$表示. 建立$AC$自动机,查询的时候沿着$fail$指针往下走,当匹配成功的时候更新$f[i]$ $f[i]$表示要屏蔽以第$i$个字母结尾的长度为$f[i]$的字符串. 原文地址:https://www.cnblogs.com/cxhscst2/p/8452147.html

2014屌丝逆袭千人大会感悟:成功篇

12月9日,我和于成龙.张力.马道长,包括VIP圈子里的一些朋友组织了2014年最后一次千人YY语音逆袭大会. 这次大会筹备一个月之久,邀请了A5图王.牟长青.乔帮主.原野等四位嘉宾,也算是比较成功,会场最高峰来了2746位听众.而且我也很自豪的说,没有用任何刷YY在线人数的软件. A5图王代表了草根站长到成功的典型,站长界泰斗级人物. 牟长青代表了草根站长成功转型微信营销的一个典型. 乔帮主代表了正在奋斗中的草根做淘宝成功的案例. 原野代表了草根站长成功逆袭的故事,从农村出身到创业成功,并有了

HDU 自动刷题机 Auto AC (轻轻松松进入HDU首页)

前言: 在写这篇文章之前,首先感谢给我思路以及帮助过我的学长们 以下4篇博客都是学长原创,其中有很多有用的,值得学习的东西,希望能够帮到大家! 1.手把手教你用C++ 写ACM自动刷题神器(冲入HDU首页) 2.[C#] 逆袭--自制日刷千题的AC自动机攻克HDU OJ 3.C#利用POST实现杭电oj的AC自动机器人,AC率高达50%~~ 4.继续Node爬虫 - 百行代码自制自动AC机器人日解千题攻占HDOJ 当初抱着想试试的想法,用过他们的程序,嗯~ o(* ̄▽ ̄*)o. 1.比如那个用C

电子商务知识精华,屌丝完美逆袭!(转)

电子商务知识精华,屌丝完美逆袭! 何为电子商务? 电子商务源于英文ELECTRONIC COMMERCE,简写为EC.顾名思义,其内容包含两方面,一是电子方式,二是商贸活动.指商务活动的电子化.网络化,通过Internet的技术或各种商务网络平台,完成商务交易,获得产品和服务. 1)        优点:品种齐全,种类繁多,一站购物,电子支付,市场全球化,全天候服务,成本低廉化(营销.店铺大小,地理位置.生产商直销等),减少人力物力,网络代购(国外独有品牌.国外价格优势.新鲜好玩),价格比较,网

做iPhone的充电宝 小米想用Max 2完成备胎逆袭

近日发布的小米Max2,从发布起,就和比它早出世一个月的本家兄弟小米6一起,被各种吹捧,同时各种吐槽. 作为小米试图重新回到智能手机一线阵营的关键棋子,小米Max2这个进击中端机型市场的非旗舰机,恰恰是为了填补小米6留下的千元机空间. 文/张书乐(人民网.人民邮电报专栏作者) 新著有<微博运营完全自学手册> 或者说,在许多商务人士已经普遍"双枪将"化的当下,它的核心任务就是充当一个备胎,危难之时显身手,即可. 充电宝+学习机,雷布斯的野望 搭载骁龙625处理器,被看做是小米

《阴阳师》加持网易逆袭腾讯,轻重游戏两巨头霸榜下活路在哪

说<阴阳师>是2016年一款现象级手游,恐怕没有人有异议,<阴阳师>自2016年9月2日在App Store首发以来,已经成为了现阶段最受追捧的手游,不仅迅速刷屏了各大社交网站,更成为热搜榜的常客,各类游戏榜单的"霸屏"者.11月发布的App Annie10月报告中,<阴阳师>在推出两个月后即登顶全球iOS收入榜第一.那么,这款游戏背后有着怎样的深意呢? 就此<每日经济新闻>记者蒋佩芳和笔者进行了一番交流. 据灼识咨询测算,腾讯和网易两家

大三广工屌丝男实习逆袭

Advertisement 这个不是炫耀,是赤裸裸的卖广告.本人是广工topview团队的一员,今年topview团队暑假找实习的战绩是3个腾讯,2个阿里,2个金山(未完待续,说不定还有UC等其他公司).各位广工大一师弟师妹如果对topview团队有兴趣的可以联系我哦! Perface 打好广告后,说说自己吧!找实习的两个月让我明白了一些道理 1 有一个很高的奋斗目标可以让你的生活过的很充实. 经历: 之前学习是看一下书有时就想刷一下微博或者看下NBA等,但是自从进入了奋斗模式后就好像完全自动屏

OSChina 周一乱弹 —— 程序猿,为什么你不能逆袭女神?

万恶的周一又来了,小伙伴们有没有按时起床准点上班呢?小小编这会也是一脸怨念地缩在被窝里发乱弹呢,到今天的动弹里又要产生那么多碎节操的段子,小小编的内心其实是崩溃的! 为了给各位小伙伴们提提神,今天乱弹由开源中国首席帅哥红薯镇楼,看看小伙们们在黑红薯的道路上如何发挥创造力的. @首席撸破皮 :其实喝大了也没啥,不过就是第二天早上起来发现红薯在隔壁而已,呵呵呵呵呵呵. 你跟红薯发生了什么事情,能说出来让大伙儿高兴高兴吗? @子矜:[路边社消息]OSC大佬红薯因不满吸毒队优胜于嫖娼队,今日前去公安局自