GRE Words Revenge AC自动机 二进制分组
题意和思路都和上一篇差不多。
有一个区别就是需要移动字符串。关于这个字符串,可以用3次reverse来转换, 前面部分翻转一下, 后面部分翻转一下, 最后整个串翻转一下就好了。
注意就是多组测试,需要初始化。
- #include<bits/stdc++.h>
- using namespace std;
- #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
- #define LL long long
- #define ULL unsigned LL
- #define fi first
- #define se second
- #define pb push_back
- #define lson l,m,rt<<1
- #define rson m+1,r,rt<<1|1
- #define max3(a,b,c) max(a,max(b,c))
- #define min3(a,b,c) min(a,min(b,c))
- typedef pair<int,int> pll;
- const int INF = 0x3f3f3f3f;
- const LL mod = (int)1e9+;
- const int N = 1e7;
- struct Node{
- static const int m = ;
- static const int KN = N;
- int next[KN][m], fair[KN], tot = , mark[KN], mark1[KN], root[], cnt = , si[];
- void init(){
- tot = cnt = ;
- }
- int newtree(){
- tot++;
- fair[tot] = mark[tot] = mark1[tot] = ;
- memset(next[tot], , sizeof(next[tot]));
- return tot;
- }
- void Build(int x){
- queue<int> q;
- q.push(x);
- int pos, p, v;
- while(!q.empty()){
- pos = q.front(), q.pop();
- for(int i = ; i < m; i++){
- if(!next[pos][i]) continue;
- p = fair[pos]; v = next[pos][i];
- while(p && !next[p][i]) p = fair[p];
- if(p) fair[v] = next[p][i];
- else fair[v] = x;
- q.push(v);
- mark1[v] = mark1[fair[v]] + mark[v];
- }
- }
- }
- void Add(char s[], char ch){
- root[++cnt] = newtree(); si[cnt] = ;
- int pos = root[cnt];
- for(int i = ; s[i]; i++){
- if(!next[pos][s[i]-ch]) next[pos][s[i]-ch] = newtree();
- pos = next[pos][s[i]-ch];
- }
- mark[pos]++;
- while(si[cnt] == si[cnt-]){
- Unit(root[cnt-], root[cnt]);
- si[--cnt] *= ;
- }
- Build(root[cnt]);
- }
- int Query(char s[], char ch){
- int pos, ret = ;
- for(int id = ; id <= cnt; id++){
- pos = root[id];
- for(int i = ; s[i]; i++){
- while(pos && !next[pos][s[i]-ch]) pos = fair[pos];
- if(pos) pos = next[pos][s[i]-ch];
- else pos = root[id];
- ret += mark1[pos];
- }
- }
- return ret;
- }
- void Unit(int u, int v){
- mark[u] += mark[v];
- for(int i = ; i < m; i++){
- if(!next[u][i] || !next[v][i]) next[u][i] += next[v][i];
- else Unit(next[u][i], next[v][i]);
- }
- }
- }ac;
- char str[N];
- set<ULL> st;
- ULL v = ;
- int main(){
- int n, m, L = , len, k;
- scanf("%d", &n);
- for(int cas = ; cas <= n; cas++){
- L = ;
- ac.init();
- st.clear();
- scanf("%d", &m);
- printf("Case #%d:\n", cas);
- while(m--){
- scanf("%s", str);
- len = strlen(str+);
- k = L % len;
- reverse(str+, str++k);
- reverse(str++k, str++len);
- reverse(str+, str++len);
- if(str[] == '+'){
- v = ;
- for(int i = ; str[i]; i++){
- v = v * + (str[i]-'');
- }
- if(st.count(v)) continue;
- else {
- st.insert(v);
- ac.Add(str+,'');
- }
- }
- else {
- L = ac.Query(str+, '');
- printf("%d\n", L);
- }
- }
- }
- return ;
- }
GRE Words Revenge AC自动机 二进制分组的更多相关文章
- 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组
F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...
- [HDU 4787] GRE Words Revenge (AC自动机)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4787 题目大意: 给你若干个单词,查询一篇文章里出现的单词数.. 就是被我水过去的...暴力重建AC自 ...
- CF710F-String Set Queries【AC自动机,二进制分组】
正题 题目链接:https://www.luogu.com.cn/problem/CF710F 题目大意 \(T\)次操作 往集合中加入一个字符串 往集合中删除一个字符串 给出一个模式串求出现的集合里 ...
- HDU 3341 Lost's revenge AC自动机+dp
Lost's revenge Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)T ...
- hdu 4117 GRE Words (ac自动机 线段树 dp)
参考:http://blog.csdn.net/no__stop/article/details/12287843 此题利用了ac自动机fail树的性质,fail指针建立为树,表示父节点是孩子节点的后 ...
- HDU3341 Lost's revenge(AC自动机&&dp)
一看到ACGT就会想起AC自动机上的dp,这种奇怪的联想可能是源于某道叫DNA什么的题的. 题意,给你很多个长度不大于10的小串,小串最多有50个,然后有一个长度<40的串,然后让你将这个这个长 ...
- hdu_3341_Lost's revenge(AC自动机+状态hashDP)
题目链接:hdu_3341_Lost's revenge 题意: 有n个模式串,一个标准串,现在让标准串重组,使得包含最多的模式串,可重叠,问重组后最多包含多少模式串 题解: 显然是AC自动机上的状态 ...
- hdu3341Lost's revenge (AC自动机+变进制dp)
Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submissio ...
- hdu3341Lost's revenge(ac自动机+dp)
链接 类似的dp省赛时就做过了,不过这题卡内存,需要把当前状态hash一下,可以按进制来算出当前的状态,因为所有的状态数是不会超过10*10*10*10的,所以完全可以把这些存下来. 刚开始把trie ...
随机推荐
- Vue项目的创建和UI资源
Vue项目创建打包与UI资源 1.Vue项目创建 1.1 vue-cli脚手架 vue-cli是一个基于vue的构建工具,用于搭建vue项目的环境,有着兼容,方便,快速的优点,能够完全遵循前后端分离的 ...
- Transformations 方块转换 USACO 模拟 数组 数学 耐心
1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec 内存限制: 128 MB提交: 10 解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...
- 5.Go-封装、继承、接口、多态和断言
面向对象 Go语言开发者认为:面向对象就是特定类型(结构体)有着自己的方法,利用这个方法完成面向对象编程, 并没有提封装.继承.多态.所以Go语言进行面向对象编程时,重点在于灵活使用方法. Go语言有 ...
- JavaFX 选择文件 导入Excel文件并解析
FXML 控制器 : @FXML public void selectExcel(MouseEvent event) { FileChooser fileChooser = new FileChoos ...
- JVM和GC的工作原理
转载于https://uestc-dpz.github.io JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM ...
- javaScript基础-02 javascript表达式和运算符
一.原始表达式 原始表达式是表达式的最小单位,不再包含其他表达式,包含常量,直接量,关键字和变量. 二.对象和数组的初始化表达式 对象和数组初始化表达式实际上是一个新创建的对象和数组. 三.函数表达式 ...
- 实时计算大数据处理的基石-Google Dataflow
此文选自Google大神Tyler Akidau的另一篇文章:Streaming 102: The world beyond batch 欢迎回来!如果您错过了我以前的帖子,Streaming ...
- 【JVM从小白学成大佬】开篇
JVM的重要性毋庸置疑,可以毫不夸张的说Java虚拟机是整个Java平台的基石. JVM方面的知识,也一直是BAT等大厂面试考核的重点.特别是JVM调优,故障排查性能调优,你知道该从哪些方面入手吗? ...
- 使用BeanShell断言判断请求返回的Json相应结果(不同json格式整理)
第一种json格式 { "code": 0, "msg": "success", "success": true, &q ...
- Okhttp3源码解析(3)-Call分析(整体流程)
### 前言 前面我们讲了 [Okhttp的基本用法](https://www.jianshu.com/p/8e404d9c160f) [Okhttp3源码解析(1)-OkHttpClient分析]( ...