2015ACM/ICPC亚洲区沈阳站
题意:给出n个字符串,求满足条件的最大下标值或层数
条件:该字符串之前存在不是 它的子串 的字符串
求解si是不是sj的子串,可以用kmp算法之类的。
strstr是黑科技,比手写的kmp快。if(strstr(s[i], s[j]) == NULL),则Si不是Sj的子串。
还有一个重要的剪枝:对于一个串,如果当前找到的串是它的母串,则下一次这个串不用遍历。
- #include <set>
- #include <queue>
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- typedef long long LL;
- #define mem(x,y) memset(x, y, sizeof(x))
- #define lson l,m,rt << 1
- #define rson m+1,r,rt << 1 | 1
- ? a : gcd(b, a % b);}
- int lcm(int a,int b){return a / gcd(a, b) * b;}
- int T, n;
- ][];
- ];
- int main()
- {
- scanf("%d", &T);
- ; Case <= T; Case++)
- {
- mem(vis, );
- scanf("%d", &n);
- getchar();
- ; i <= n; i++)
- {
- scanf("%s", s[i]);
- }
- ;
- ; i <= n; i++)
- {
- ;
- ; j >= ; j--)
- {
- if(vis[j]) continue;
- if(strstr(s[i], s[j]) == NULL)//sj 不是 si的子串
- {
- ok = ;
- break;
- }
- else
- {
- vis[j] = ;//重要剪枝
- }
- }
- if(ok) ans = i;
- }
- printf("Case #%d: %d\n", Case, ans);
- }
- ;
- }
题意:有n个庙经过长时间风吹雨打需要修补,只有两座(被标记为a,b)完好无损不需要修补,有两个和尚轮流去修补这n-2个庙,每个和尚每次只能修补一个庙标记为i,并要求i满足i=j+k或者i=j-k,每个庙只能被修建一次;其中j和k代表已经修建好的庙,Yuwgna先开始,问最后谁不能修建谁输;
更相减损术!(gcd里头:辗转相除法,更相减损术,自行百度)
更相减损术:
- #include <set>
- #include <queue>
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- typedef long long LL;
- #define mem(x,y) memset(x, y, sizeof(x))
- #define lson l,m,rt << 1
- #define rson m+1,r,rt << 1 | 1
- ? a : gcd(b, a % b);}
- int T, n, x, y;
- int main()
- {
- scanf("%d", &T);
- ; Case <= T; Case++)
- {
- scanf("%d%d%d", &n, &x, &y);
- int g = gcd(x, y);
- int cnt = n / g;
- printf("Case #%d: ", Case);
- printf( ? "Yuwgna" : "Iaka");
- }
- ;
- }
题意:给你一个n个点,m个集合的图,每个集合中的点都可以以di的距离相互的到达,问你两个人同时从1和n出发,会在那个点相遇。
每个集合内部里的所有的边都是互通的,如果一个个连就要n²了,可以采用增加虚拟结点的方式,来减少点。虚拟一个s,一个e,把他们连接起来。
- ; i <= m; i++)
- {
- int w, num;
- int s = n + i, e = n + i + m;
- scanf("%d%d", &w, &num);
- G[s].push_back(edge(e, w));
- while(num--)
- {
- int x;
- scanf("%d", &x);
- G[e].push_back(edge(x, ));
- G[x].push_back(edge(s, ));
- }
- }
- //题意:给你一个n个点,m个集合的图,每个集合中的点都可以以di的距离相互的到达,问你两个人同时从1和n出发,会在那个点相遇。
- #include <set>
- #include <queue>
- #include <cstdio>
- #include <vector>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- typedef long long LL;
- #define mem(x,y) memset(x, y, sizeof(x))
- #define lson l,m,rt << 1
- #define rson m+1,r,rt << 1 | 1
- ? a : gcd(b, a % b);}
- int lcm(int a,int b){return a / gcd(a, b) * b;}
- int T, n, m, Case;
- LL ans;
- ;
- const LL INF = 1e18;
- ;
- LL d1[ssize], d2[ssize];
- struct edge
- {
- int to;
- LL co;
- edge(int tt, LL cc):to(tt), co(cc){}
- bool operator < (const edge &other)const
- {
- return co > other.co;
- }
- };
- vector<edge>G[ssize];
- void init()
- {
- ; i <= n + * m; i++) G[i].clear();
- ans = INF;
- }
- void dijkstra(int s, LL dis[])
- {
- ; i <= n + * m; i++) dis[i] = INF;
- priority_queue<edge>que;
- dis[s] = ;
- que.push(edge(s, dis[s]));
- while(!que.empty())
- {
- edge p = que.top();que.pop();
- int v = p.to;
- if(dis[v] < p.co) continue;
- ; i < G[v].size(); i++)
- {
- edge e = G[v][i];
- if(dis[e.to] > dis[v] + e.co)
- {
- dis[e.to] = dis[v] + e.co;
- que.push(edge(e.to, dis[e.to]));
- }
- }
- }
- }
- void solve()
- {
- dijkstra(, d1);
- dijkstra(n, d2);
- ans = INF;
- ; i <= n; i++)
- {
- ans = min(ans, max(d1[i], d2[i]));
- }
- printf("Case #%d: ", Case);
- if(ans == INF)
- printf("Evil John\n");
- else
- {
- printf("%I64d\n", ans);
- ;
- ; i <= n; i++)
- {
- if(ans == max(d1[i], d2[i])) cnt++;
- }
- ; i <= n; i++)
- {
- if(ans == max(d1[i], d2[i])) cnt--, printf("%d%c", i, cnt ? ' ' : '\n' );
- }
- }
- }
- int main()
- {
- scanf("%d", &T);
- ; Case <= T; Case++)
- {
- scanf("%d%d", &n, &m);
- init();
- ; i <= m; i++)
- {
- int w, num;
- int s = n + i, e = n + i + m;
- scanf("%d%d", &w, &num);
- G[s].push_back(edge(e, w));
- while(num--)
- {
- int x;
- scanf("%d", &x);
- G[e].push_back(edge(x, ));
- G[x].push_back(edge(s, ));
- }
- }
- solve();
- }
- ;
- }
2015ACM/ICPC亚洲区沈阳站的更多相关文章
- 2015ACM/ICPC亚洲区沈阳站 Pagodas
Pagodas Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- 2015ACM/ICPC亚洲区沈阳站 B-Bazinga
Bazinga Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
- hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: ...
- 2015ACM/ICPC亚洲区沈阳站 Solution
A - Pattern String 留坑. B - Bazinga 题意:找一个最大的i,使得前i - 1个字符串中至少不是它的子串 思路:暴力找,如果有一个串已经符合条件,就不用往上更新 #inc ...
- 2015ACM/ICPC亚洲区沈阳站 部分题解
链接在这:http://bak.vjudge.net/contest/132442#overview. A题,给出a,b和n,初始的集合中有a和b,每次都可以从集合中选择不同的两个,相加或者相减,得到 ...
- 2015ACM/ICPC亚洲区沈阳站重现赛-HDU5512-Pagodas-gcd
n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...
- 2015ACM/ICPC亚洲区沈阳站-重现赛 M - Meeting (特殊建边,最短路)
题意:有\(n\)个点,\(m\)个集合,集合\(E_i\)中的点都与集合中的其它点有一条边权为\(t_i\)的边,现在问第\(1\)个点和第\(n\)个点到某个点的路径最短,输出最短路径和目标点,如 ...
- 2015ACM/ICPC亚洲区沈阳站-重现赛 B - Bazinga (KMP)
题意:给你\(n\)个字符串,\(s_1,s_2,...,s_n\),对于\(i(1\le i\le n)\),找到最大的\(i\),并且满足\(s_j(1\le j<i)\)不是\(s_i\) ...
- 2015ACM/ICPC亚洲区沈阳站-重现赛 D - Pagodas
题意:有\(n\)个数,开始给你两个数\(a\)和\(b\),每次找一个没出现过的数\(i\),要求满足\(i=j+k\)或\(i=j-k\),当某个人没有数可以选的时候判他输,问谁赢. 题解:对于\ ...
随机推荐
- DropDownList控件
1.DropDownList控件 <asp:DropDownList runat="server" ID="DropDownList1" AutoPost ...
- php.ini 中文注释
这个文件控制了PHP许多方面的观点.为了让PHP读取这个文件,它必须被命名为 ; ´php.ini´.PHP 将在这些地方依次查找该文件:当前工作目录:环境变量PHPRC ; 指明的路径:编译时指定的 ...
- yii2 session的使用方法
yii2打开session use yii\web\Session; $session = Yii::$app->session; // check if a session is alread ...
- Java编程中的美好
java程序员如何写出"优美"代码,动力节点告诉你怎么办: 1.注释尽可能全面 对于方法的注释应该包含详细的入参和结果说明,有异常抛出的情况也要详细叙述:类的注释应该包含类的功能说 ...
- 10月30日上午MySQL数据库的修改(从网页上实现对数据库的更改)
从网页页面上对数据库进行更改,连接着之前做的增加.删除.查询. 1.先做一个修改页面 <body> <!--这个页面需要让用户看到一些数据,所以不是一个纯php页面,页面效果和增加页 ...
- diff 比较两个文件的差异
功能:比较两个文件的差异,并把不同地方的信息显示出来.默认diff格式的信息. diff比较两个文件或文件集合的差异,并记录下来,生成一个diff文件,这也是我们常说的补丁文件.也使用patch命令对 ...
- c# 网络
http://www.cnblogs.com/fuchongjundream/p/4079128.html http://stackoverflow.com/questions/21728773/th ...
- golang笔记——流程控制
条件语句 if ... else if ... else 语句,如: { fmt.Println(">100") } < num { fmt.Println(" ...
- Android检测网络是否正常代码!
在Android开发中,如果该应用程序需要连接网络请求,那么最好我们先做一个检测网络是否在线的判断,否则程序容易出现卡死或FC等Bug,应该判断如果手机离线则弹出提示让用户检查网络,如果正常则继续执行 ...
- 02OC的类和对象
这章重点介绍OC的类以及对象,由于C语言是面向过程语言,而OC只是对于C语言多了一些面向对象的特性,所以OC相对于其他面向对象语言,例如C#.Java等没有那么多的语法特性,所以差别还是比较大的. 一 ...