【弱省胡策】Round #6 String 解题报告
2015-06-18 17:18
316 查看
感觉这个题好神啊。
首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串。
具体就是把串先倍长,然后倒过来,然后求 $Next$ 数组,然后从 $2n$ 开始沿着 $Next[]$ 跳,直到跳到 $\le n$ 的时候停止,看哪些位置被跳到了,哪些位置就是合法的。
问题是现在 $a \neq b$ 怎么办。。?
我猜啊,我们可以求出限制是 $a$ 的倍数时,哪些 B 串是合法的,再求出限制是 $b$ 的倍数是,哪些是合法的。
然后只要在一种情况下合法,那么这个 B 串就可以写进来。
至于为什么,我也不知道。反正和暴力拍了拍一直没出错。
然后就做完啦~~~
时间空间复杂度均为 $O(n)$。
String_Gromah
首先我们只管 $a = b$ 的情况,那么我们自然就可以把这个串对 $a$ 取模,然后用 KMP 求出能弄出几个其他的 B 串。
具体就是把串先倍长,然后倒过来,然后求 $Next$ 数组,然后从 $2n$ 开始沿着 $Next[]$ 跳,直到跳到 $\le n$ 的时候停止,看哪些位置被跳到了,哪些位置就是合法的。
问题是现在 $a \neq b$ 怎么办。。?
我猜啊,我们可以求出限制是 $a$ 的倍数时,哪些 B 串是合法的,再求出限制是 $b$ 的倍数是,哪些是合法的。
然后只要在一种情况下合法,那么这个 B 串就可以写进来。
至于为什么,我也不知道。反正和暴力拍了拍一直没出错。
然后就做完啦~~~
时间空间复杂度均为 $O(n)$。
#include <cstdio> using namespace std; #define N 2000000 + 5 int n, a, b, A , _A , Next ; bool Flag ; inline int getint() { char ch = '\n'; for (; ch != '-' && (ch > '9' || ch < '0'); ch = getchar()) ; int f = ch == '-' ? -1 : 1; int res = ch == '-' ? 0 : ch - '0'; for (ch = getchar(); ch >= '0' && ch <= '9'; ch = getchar()) res = (res << 3) + (res << 1) + ch - '0'; return res * f; } inline void Work(int x) { for (int i = 1; i <= n; i ++) _A[i] = A[n - i + 1] % x; for (int i = 1; i <= n; i ++) _A[i + n] = _A[i]; int k = 0, j = 1; Next[1] = 0; while (j <= (n << 1)) { if (!k || _A[k] == _A[j]) Next[++ j] = ++ k; else k = Next[k]; } for (int x = n << 1 | 1; x > n + 1; x = Next[x]) Flag[(n + 1 << 1) - x] = 1; } inline void Solve() { n = getint(), a = getint(), b = getint(); for (int i = 1; i <= n; i ++) { A[i] = getint(); Flag[i] = 0; } Work(a), Work(b); int ans = 0; for (int i = 1; i <= n; i ++) if (Flag[i]) ans ++; if (ans == 1) ans = 0; printf("%d\n", ans); } int main() { for (int _ = getint(); _; _ --) Solve(); return 0; }
String_Gromah
相关文章推荐
- 动态规划 0--1 背包问题
- css之文档流
- EHCache的使用
- Table的TR之间出现空格
- 数组划分
- function method(){}与var method = function(){}的区别
- iOS 模拟器小技巧
- Node.js学习--基础知识(9)--HTTP服务器
- Retrofit源码解析
- a为什么做java的web开发我们会使用struts2,springMVC
- 解决 SharePoint 2013 An update conflict has occurred, and you must re-try this action
- 一致性 hash 算法
- css之float深入剖析
- Cocos2d-x源码粗析1.base-nodes
- easyui进度条函数使用例子
- Windows 7/8各版本支持最大内存容量
- 数据结构实验之队列一:排队买饭
- Android--ListView点击Item展开的实现
- 从Eclipse到Intellij
- 数据结构实验之队列一:排队买饭 分类: 栈和队列 2015-06-18 17:16 14人阅读 评论(0) 收藏