n个字符串 m个询问 每个询问给出前后缀 并且不重合 问有多少个满足

m挺大 如果在线只能考虑logn的算法

官方题解:对n个串分别存正序倒序 分别按照字典序sort 每一个串就可以被化作一个点 那么对于每一个询问 前后缀都会有一个范围 那就是求这个范围里面的点的个数

官方题解转化到了求矩形并 然而没理解怎么转化 倒是想出来了kdtree直接求范围点 由于前后缀不能重合 即如果有aa aa这个询问 我的办法会找到aaa 就要进行去重

我用map记录 然后每次询问都查询一下。。跑的特别慢。。

但是在写这个博客的时候想出来 可以存三维点 第三维代表这n个串的长度 那么就可以查询len>某个值 进行三维查询

不知道复杂度是不是还会很高。。明天试一下

我的做法:对于n个串 abcde -> abcde*abcde m个询问 ab   de -> de*ab 这样直接离线n个串 先把m个询问插进去 记录一下id 直接用n个串跑 最后输出ans

在其中记录fail树上每个点的dep 如果这个点的dep > n个串的长度 就不对答案贡献

但是这样又有了一个新的问题 一模一样的询问会少算 于是我用map<string,int>来记录一下是否已经出现 如果出现了那么这个询问不insert 而是直接指向最早出现的询问

写了一万个bug...不过顺便学习了线段树求矩形面积/周长并

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<vector>
#include<map>
#include<queue>
#include<algorithm>
using namespace std;
#define L long long
#define pb push_back string a[100050] ;
int n , m ;
char s[500050 * 2] , s2[500050*2];
int ans[100050] ;
struct tire{
int nex[700010*2][27] , fail[700010*2], id[700010*2];
int last[700010*2] ;
int dep[700010*2] ;
int root,l;
int newnode(){
for(int i=0;i<27;i++)nex[l][i]=-1;
last[l]=0;
id[l++]=0;
return l-1;
}
void init(){
l=0;
root=newnode();
dep[root]=0;
}
void inse(string s ,int idd){
int le = s.length() ;
int now=root;
for(int i=0;i<le;i++){
int x;
if(s[i]>='a'&&s[i]<='z')x=s[i]-'a';
else x=26;
if(nex[now][x] == -1) {
nex[now][x] = newnode(); }
now=nex[now][x];
dep[now]=i+1;
}
id[now]=idd;
}
void build() {
queue<int>q;
fail[root]=root;
for(int i=0;i<27;i++){
if(nex[root][i]==-1)
nex[root][i]=root;
else {
fail[nex[root][i]]=root;
q.push(nex[root][i]);
}
}
while(!q.empty()){
int now=q.front();q.pop();
for(int i= 0;i<27;i++){
if(nex[now][i]==-1)
nex[now][i]=nex[fail[now]][i] ;
else {
fail[nex[now][i]] = nex[fail[now]][i] ;
q.push(nex[now][i]) ;
}
}
}
}
void query(string s, int cd , int num){
int le = s.length() ;
int now=root;
int res = 0 ;
for(int i = 0 ; i < le ; i ++ ) {
int x;
if(s[i]>='a'&&s[i]<='z')x=s[i]-'a';
else x=26;
now = nex[now][x];
int temp=now;
while(temp!=root){
if(id[temp]!=0 && dep[temp] <= cd+1){
ans[id[temp]]++;
}
temp = fail[temp] ;
}
}
}
}ac;
map<string,int>mp;
int main () {
int t ; scanf("%d",&t);
while(t -- ) {
mp.clear();
ac.init() ;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
cin>>a[i];
}
string c;
memset(ans,0,sizeof(ans));
for(int i=1;i<=m;i++){
string s1,s2;
cin>>s1>>s2;
s2+="*";s2+=s1;
if(mp[s2]!=0)
ans[i]=mp[s2]*-1;
else{
ac.inse(s2,i);
mp[s2]=i;
}
}
ac.build();
for(int i=1;i<=n;i++){
int len=a[i].length() ;
string s=a[i];s+="*";s+=a[i];
ac.query(s , len , i) ;
}
for(int i=1;i<=m;i++){
if(ans[i]<0){
printf("%d\n",ans[ans[i]*(-1)]);
}
else {
printf("%d\n",ans[i]);
}
}
}
}

  

HDU 6096 AC自动机的更多相关文章

  1. hdu 2896 AC自动机

    // hdu 2896 AC自动机 // // 题目大意: // // 给你n个短串,然后给你q串长字符串,要求每个长字符串中 // 是否出现短串,出现的短串各是什么 // // 解题思路: // / ...

  2. hdu 3065 AC自动机

    // hdu 3065 AC自动机 // // 题目大意: // // 给你n个短串,然后给你一个长串,问:各个短串在长串中,出现了多少次 // // 解题思路: // // AC自动机,插入,构建, ...

  3. hdu 5880 AC自动机

    Family View Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total ...

  4. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. hdu 2825 aC自动机+状压dp

    Wireless Password Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  6. hdu 3065 AC自动机(各子串出现的次数)

    病毒侵袭持续中 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. HDU 5384 AC自动机

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5384 题意:给n个母串,给m个匹配串,求每个母串依次和匹配串匹配,能得到的数目和. 分析:之前并不知道AC ...

  8. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  9. HDU 2846 (AC自动机+多文本匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统 ...

随机推荐

  1. SSH配置免秘钥登录

    一.  SSH 配置免秘要登录 配置SSH 免秘要登录,虽然就那么几步,但总是会出现点小问题,今天就做下记录.SSH 免秘钥就是让两台机器相互信任,不需要输入密码就能相互登录.配置相互信任就是把各自的 ...

  2. std::condition_variable(2)复习

    #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::yie ...

  3. php后门管理工具weevely

    weevely是一款php后门管理工具,使用http头进行指令传输,功能强大.不过只支持php. weevely生成的服务器端php代码是经过了base64编码的,所以可以骗过主流的杀毒软件和IDS, ...

  4. The E-pang Palace(暴力几何)

    //暴力的几何题,问,n个点可以组成的矩形,不相交,可包含的情况下,最大的面积,还有就是边一定与 x y 轴平行,所以比较简单了 //暴力遍历对角线,搜出所有可能的矩形,然后二重循环所有矩形,判断一下 ...

  5. Oracle备份一张表

    数据库:myOnly 创建表:myTable 的备份表 myTable_tmpe create table myTable_tmpe as select * from myTable ; 补充: -- ...

  6. Xenserver中SR、VBD和VDI之间的关系

    首先需要理解xenserver下的SR,VDI,VBD这三个概念.如下图 存储库 (SR) 虚拟磁盘映像 (VDI) 物理块设备 (PBD) 虚拟块设备 (VBD) 看上图所示,他们之间的关系. SR ...

  7. el-tree 设置目录树中的某个节点为高亮状态

    现在可以实现,点击某个节点,该节点会红色高亮,那怎么让这个树加载出来的时候 默认某个节点高亮呢?element ui里面带勾选框的可以默认勾选上,这个没有勾选框 其实很简单.element ui的树形 ...

  8. mac开发环境爬坑记(搭建php+nginx+mysql+redis+laravel+git+phpstorm)

    题外话:前几天,终于以原价一半的价格,将我那台15版mbp在bbs上卖了出去.之所以用了“终于”这个词儿,是我一直迟迟没有下定决心卖掉它,可眼瞅着再不卖掉,又要掉价,况且我的新电脑,也终于下来了. 话 ...

  9. MySQL 5.6 死锁演示 及 日志分析

    1.  表结构 CREATE TABLE dead_update ( a ) ', PRIMARY KEY (a) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; ), ...

  10. ABAP开发中message dump

    系统里边 消息 造成dump示例, 1.面向对象的method 中一般不能用stop, 例如data_change事件, ** sm30 不能stop, 2. 增强中 有些地方不能stop, 3.还有 ...