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\),当某个人没有数可以选的时候判他输,问谁赢. 题解:对于\ ...
随机推荐
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
- hibernate-criteria查询(二)
Restrictions 类的作用是什么? Criteria 接口没有 iterate() 方法. Criteria 查询如何对查询结果排序.分页? Criteria 查询如何实现关联? ...
- Node实践之一
大家都知道JavaScript的专长就是处理客户端也就是与浏览器打交道了,所有的与服务器端的交互必须交给后台语言处理程序去做,基于JavaScript不能与服务器进行直接交互这样一个现状,Ryan D ...
- Ubuntu学习总结-07 Nodejs和npm的安装
一 安装NodeJS 1 下载nodejs源码 从以下网址下载最新的Nodejs源码 https://nodejs.org/en/download/ 2 安装依赖的 python,gcc,g++ 函数 ...
- Git入门
转: http://www.cnblogs.com/luxiaojun/p/5944145.html
- 在linux命令行下执行php 程序
如何在linux命令行下,执行php程序. 例子 打印当前时间 php -r "echo time()" 随机输出一个数字 php -r "echo rand(1,20) ...
- xen下离线读取虚拟机磁盘镜像的补丁
之前在xen-3.4.2和xen-4.1.2下做过几个基于qemu模拟器的补丁,就是想着不用通过xm create(xen3下面)或xl create(xen4下面)启动虚拟机,而能直接去解析磁盘镜像 ...
- Linux C popen()函数详解
表头文件 #include<stdio.h> 定义函数 FILE * popen( const char * command,const char * type); 函数说明 popen( ...
- Mac Pro 实现 PHP-5.6 与 PHP-7.0 等多版本切换
先前参考 如何 实现PHP多版本的 共存 和 切换? 实现了Linux(Ubuntu/CentOS)系统下,PHP多版本的切换,但是在 Mac OS 下,由于用户权限控制的比较严格,文章里提到的脚本运 ...
- Virtual Box下配置Host-Only联网方式详解
其实网络这类相关的文章很多,我只是想结合自己的实际情况,把我的经验写下来,给那些需要的人们吧. 主机:windows 7 虚拟机:CentOS6.0 VirtualBox:4.2.0 虚拟机在安装好之 ...