srm 541
2016-03-17 12:19
120 查看
资瓷点这里阅读该文章O_o
250
Solution
水题,最暴力的方法枚举就可以Code
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define F first #define S second typedef long long LL; typedef pair<int, int> pii; map<char, int> s; int dx[] = {0, 1, -1, 0}; int dy[] = {1, 0, 0, -1}; const int N = 55; int f ; bool vis ; struct AntsMeet { int countAnts(vector <int> x, vector <int> y, string direction) { int n = x.size(); s['N'] = 0, s['E'] = 1, s['W'] = 2, s['S'] = 3; for (int i = 0; i < n; ++i) x[i] <<= 1, y[i] <<= 1, f[i] = s[direction[i]], vis[i] = 1; for (int i = 1; i <= 4001; ++i) { for (int j = 0; j < n; ++j) if (vis[j]) { for (int k = j + 1; k < n; ++k) if (vis[k]) { if (x[j] == x[k] && y[j] == y[k]) vis[j] = vis[k] = 0; } } for (int j = 0; j < n; ++j) if (vis[j]) { x[j] += dx[f[j]]; y[j] += dy[f[j]]; } } int ans = 0; for (int i = 0; i < n; ++i) if (vis[i]) ++ans; return ans; } };
550
Description
给出串A,B,C,S,F和整数k。以及函数f(x)=A+x+B+x+C。
求fk(x)中以F为子串,出现了多少次。答案mod 109+7。
串的长度≤50, k≤107
Solution
注意到串长度≤50,以及k≤107,并且出现F的情况分为在A。B。C三个串中分别出现,以及在交界处出现。因为串的长度比較小,所以我们暴力50次以后,交界处包括F的次数就不再变化了(想一想,为什么)。于是后面的情况我们每次ans=ans×2+t就可以。。t是交界处的答案,ans是A,B,C中的答案。Code
#include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define F first #define S second typedef long long LL; typedef pair<int, int> pii; const int M = 1e9 + 7; struct AkariDaisukiDiv1 { int gao(const string &s, const string &t, int l = 0, int r = 100000000) { int tmp = 0; for (int i = l; i < s.size() - t.size() + 1 && i < r; ++i) if (s.substr(i, t.size()) == t) ++tmp; return tmp; } int countF(string A, string B, string C, string S, string F, int k) { int cnt = 0; for (; cnt < k && S.size() < F.size(); ++cnt) S = A + S + B + S + C; if (S.size() < F.size()) return 0; int ans = gao(S, F), t = 0; string p = S.substr(0, F.size()), q = S.substr(S.size() - F.size(), F.size()); for (int i = 0; cnt < k && i < 50; ++cnt, ++i) { t = gao(A + p, F, 0, A.size()) + gao(q + B + p, F, 1, F.size() + B.size()) + gao(q + C, F, 1); ans = (ans + ans + t) % M; p = (A + p).substr(0, F.size()), q = (q + C).substr((q + C).size() - F.size(), F.size()); } for (; cnt < k; ++cnt) ans = (ans + ans + t) % M; return ans; } };
相关文章推荐
- C++某些函数的介绍
- HDU1078 FatMouse and Cheese(记忆化搜索)
- 夺命雷公狗---DEDECMS----6快速入门之总结篇
- 复利计算3.0
- 301和302的区别
- java.lang.reflect.invocationtargetexception 错误问题。。
- Libevent源码分析(三)--- IO多路复用模型
- 使用apicloud完成消息推送功能
- 蒲峰投针实验
- iOS-WebKit之WKWebView(一个高性能的WebView)
- Java初级工程师面试题精选1
- 《剑指offer》:行列有序的二维数组查找()
- UITableview
- 第三周项目四穷举法解决组合问题
- ajax load事件
- Android实现将控件等View转化为Bitmap对象,通过ImageView显示的功能
- 使用symfony命令创建项目的方法
- 接口可以初始化
- ArcGIS API for JavaScript开发教程系列(四)之离线部署与跨域问题
- 【Python】Python Mako模板使用