5510  Bazinga

题意:给出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);
     }
     ;
 }

5512  Pagodas

题意:有n个庙经过长时间风吹雨打需要修补,只有两座(被标记为a,b)完好无损不需要修补,有两个和尚轮流去修补这n-2个庙,每个和尚每次只能修补一个庙标记为i,并要求i满足i=j+k或者i=j-k,每个庙只能被修建一次;其中j和k代表已经修建好的庙,Yuwgna先开始,问最后谁不能修建谁输;

更相减损术!(gcd里头:辗转相除法,更相减损术,自行百度)

更相减损术:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
所以它在1-n里头,只要是它的最小公因数的倍数的数都是可以选择的点,所以答案是n / gcd(x, y)
主要是由i = j - k联想出来的。
 #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");
     }
     ;
 }

5521  Meeting

题意:给你一个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亚洲区沈阳站的更多相关文章

  1. 2015ACM/ICPC亚洲区沈阳站 Pagodas

    Pagodas Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  2. 2015ACM/ICPC亚洲区沈阳站 B-Bazinga

    Bazinga Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  3. hdu 5510 Bazinga (kmp+dfs剪枝) 2015ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)

    废话: 这道题很是花了我一番功夫.首先,我不会kmp算法,还专门学了一下这个算法.其次,即使会用kmp,但是如果暴力枚举的话,还是毫无疑问会爆掉.因此在dfs的基础上加上两次剪枝解决了这道题. 题意: ...

  4. 2015ACM/ICPC亚洲区沈阳站 Solution

    A - Pattern String 留坑. B - Bazinga 题意:找一个最大的i,使得前i - 1个字符串中至少不是它的子串 思路:暴力找,如果有一个串已经符合条件,就不用往上更新 #inc ...

  5. 2015ACM/ICPC亚洲区沈阳站 部分题解

    链接在这:http://bak.vjudge.net/contest/132442#overview. A题,给出a,b和n,初始的集合中有a和b,每次都可以从集合中选择不同的两个,相加或者相减,得到 ...

  6. 2015ACM/ICPC亚洲区沈阳站重现赛-HDU5512-Pagodas-gcd

    n pagodas were standing erect in Hong Jue Si between the Niushou Mountain and the Yuntai Mountain, l ...

  7. 2015ACM/ICPC亚洲区沈阳站-重现赛 M - Meeting (特殊建边,最短路)

    题意:有\(n\)个点,\(m\)个集合,集合\(E_i\)中的点都与集合中的其它点有一条边权为\(t_i\)的边,现在问第\(1\)个点和第\(n\)个点到某个点的路径最短,输出最短路径和目标点,如 ...

  8. 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\) ...

  9. 2015ACM/ICPC亚洲区沈阳站-重现赛 D - Pagodas

    题意:有\(n\)个数,开始给你两个数\(a\)和\(b\),每次找一个没出现过的数\(i\),要求满足\(i=j+k\)或\(i=j-k\),当某个人没有数可以选的时候判他输,问谁赢. 题解:对于\ ...

随机推荐

  1. 【团队项目选题】自选项目:桌游APP

    由于我们团队的黄金点游戏结果是第二名,按理说是一定能选到一个自选项目的,所以以下只列出我们选择的自选项目 自选项目名称 桌游APP   暂定 (名字还没想好) 项目大致介绍 此APP集成了多种桌游,主 ...

  2. hibernate-cache

    hibernate缓存分:一级缓存.二级缓存.三级缓存 一级缓存:Session内的缓存 实例: /*一级缓存: * session内的缓存 * */ @Test public void test1( ...

  3. 简明Linux命令行笔记:mv

    重命名.覆盖或移动文件 mv [options] existing-file new-filename mv [options] existing-file-list directory mv [op ...

  4. 概率论与数理统计图解.tex

    \documentclass[UTF8,a1paper,landscape]{ctexart} \usepackage{tikz} \usepackage{amsmath} \usepackage{a ...

  5. 浅谈MVC中路由

    引言 学习ASP.NET MVC 路由这一关是肯定必不可少的.这一节,我们就来简单介绍下MVC中的路由机制.简单的路由机制相信大家都已了解,这一节主要介绍路由中很少使用的部分. 使用静态URL片段 在 ...

  6. Daily Build

    Daily Build 是一件非常有意义的事情,也是敏捷开发中关于 “持续集成” 的一个实践.Daily Build 对于开发来说有如下好处: 保证了每次 check in 的代码可用,不会造成整个工 ...

  7. mysql问题

    mysql x64,由于没有msi版,因此,在使用上可能会出现一些问题. 一.  配置环境变量: 只需把mysql/bin文件夹地址完整地添加到Path中,用“;”与前面的参数隔开.需注意,mysql ...

  8. [NHibernate]延迟加载

    目录 写在前面 文档与系列文章 延迟加载 一个例子 总结 写在前面 上篇文章介绍了多对多关系的关联查询的sql,HQL,Criteria查询的三种方式.本篇文章将介绍nhibernate中的延迟加载方 ...

  9. 条件编译#if #ifdef

    近期由于一些莫名其妙的原因开始学c++,我觉得我哪天要是挂了也是被自己给折腾死的,算了,反正不是折腾死就是被淘汰,当是没事打发时间了,废话不多说,开始今天的主题. 之前接触的注释就是注释,条件语句就是 ...

  10. C# 使用Silverlight toolkit Chart

    一.基础介绍 Silverlight ToolKit是微软发布的基于Microsoft-Public License(MS-PL)许可协议的控件集.MS-PL许可协议允许商业或非商业的发布,所以我们可 ...