题目链接:hdu_4787_GRE Words Revenge

题意:

总共有n个操作,2种操作。每行读入一个字符串。

1.如果字符串以+开头,此为单词(即模式串,不考虑重复)

2.如果字符串以?开头,此为文章(即文本串,查询在此之前的单词在文本串中出现的次数)

题解:

强制在线的AC自动机

贴个大牛的详细题解http://blog.csdn.net/no__stop/article/details/16823479

这样的带合并操作的AC自动机用第二种建树的方式比较方便

 #include<bits/stdc++.h>
#define F(i,a,b) for(int i=a;i<=b;i++)
using namespace std; const int AC_N=1e5+,tyn=,M=5e6+;//数量乘串长,类型数
struct AC_automation{
int tr[AC_N][tyn],cnt[AC_N],Q[AC_N],fail[AC_N],tot;
void nw(){cnt[++tot]=;memset(tr[tot],-,sizeof(tr[tot]));}
void init(){tot=-,fail[]=-,nw();}
void insert(char *s,int x=){
for(int i=,w;s[i];x=tr[x][w],i++)
if(tr[x][w=s[i]-'']==-)nw(),tr[x][w]=tot;
cnt[x]=;//串尾标记
}
void build(int head=,int tail=){
F(i,,)if(~tr[][i])Q[++tail]=tr[][i],fail[tr[][i]]=;
while(head<=tail){
for(int i=,x=Q[head++],p=-;i<tyn;i++)if(~tr[x][i]){
for(p=fail[x],fail[tr[x][i]]=;~p;p=fail[p])
if(~tr[p][i]){fail[tr[x][i]]=tr[p][i];break;}
Q[++tail]=tr[x][i];
}
}
}
int ask(char *s,int ans=){
for(int w,i=,x=,j;s[i];i++){
while(tr[x][w=s[i]-'']==-&&x)x=fail[x];
x=tr[x][w],x=(~x)?x:,j=x;
while(j){if(cnt[j])ans++;j=fail[j];}
}
return ans;
} }a,b; char s[M],tps[M];
int t,n,an,sqr=,bcnt; void dfs(int r1,int r2)//将b中以r2为根结点的树合并到a中以r1为根结点的树中
{
F(i,,)if(~b.tr[r2][i])
{
if(a.tr[r1][i]==-)a.nw(),a.tr[r1][i]=a.tot;
a.cnt[a.tr[r1][i]]|=b.cnt[b.tr[r2][i]];
dfs(a.tr[r1][i],b.tr[r2][i]);
}
} void join(){dfs(,),b.init(),a.build();}//将b合并到a中 void decrypt()
{
int len=strlen(s);
int k=an%(len-),ed=;
F(i,,len-)tps[i]=s[i];
F(i,k+,len-)s[++ed]=tps[i];
F(i,,k)s[++ed]=tps[i];
} int main()
{
scanf("%d",&t);
F(ic,,t)
{
printf("Case #%d:\n",ic);
scanf("%d",&n);
a.init(),b.init(),an=bcnt=;
F(i,,n)
{
scanf("%s",s),decrypt();
if(s[]=='+')
{
b.insert(s+),b.build(),bcnt++;
if(bcnt>sqr)join();
}else printf("%d\n",(an=a.ask(s+)+b.ask(s+)));
}
}
return ;
}

hdu_4787_GRE Words Revenge(在线AC自动机)的更多相关文章

  1. HDU4787 GRE Words Revenge【AC自动机 分块】

    HDU4787 GRE Words Revenge 题意: \(N\)次操作,每次记录一个\(01\)串或者查询一个\(01\)串能匹配多少个记录的串,强制在线 题解: 在线的AC自动机,利用分块来降 ...

  2. CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

    ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...

  3. HDU4787 GRE Words Revenge(AC自动机 分块 合并)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4787 Description Now Coach Pang is preparing for ...

  4. CodeForces 710F 强制在线AC自动机

    题目链接:http://codeforces.com/contest/710/problem/F 题意:维护一个集合,集合要求满足三种操作. 1 str:向集合插入字符串str(保证不会插入之前已经插 ...

  5. 【HDOJ3341】Lost's revenge(AC自动机,DP)

    题意:给出一个n个模式串,一个目标串,问把目标串重新排位最多能产生多少个模式串,可以重叠且所有串只包含A C G T. n<=10,len[i]<=10 len(s)<=40 Cas ...

  6. 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 ...

  7. 【HDU3341】 Lost's revenge (AC自动机+状压DP)

    Lost's revenge Time Limit: 5000MS Memory Limit: 65535KB 64bit IO Format: %I64d & %I64u Descripti ...

  8. HDU3341 Lost's revenge(AC自动机+DP)

    题目是给一个DNA重新排列使其包含最多的数论基因. 考虑到内存大概就只能这么表示状态: dp[i][A][C][G][T],表示包含各碱基个数为ACGT且当前后缀状态为自动机第i的结点的字符串最多的数 ...

  9. HDU 3341 Lost's revenge (AC自动机 + DP + 变进制/hash)题解

    题意:给你些分数串,给你一个主串,主串每出现一个分数串加一分,要你重新排列主串,最多几分 思路:显然这里开$40^4$去状压内存不够.但是我们自己想想会发现根本不用开那么大,因为很多状态是废状压,不是 ...

随机推荐

  1. git stash让bug来的更猛烈些吧

    git stash可以用来暂存当前正在进行的工作,比如想pull最新的代码,又不想加新commit, 或者有一个紧急的bug需要修复,但是这个bug又与你已经在做的工作(还没完成)有关联.这个时候有的 ...

  2. python学习——DAY1

    日期:20170113 一.个人体会: 零基础学python,是艰辛的,需要付出和坚持. 关于流程图.我最开始画的是从上到下,再从左到右,画了很多重复的内容,单线程的流程图,看起来很容易理解,但是自己 ...

  3. springMVC Helloword 入门程序

    1  首先是在web.xml 中配置 <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-cl ...

  4. Laravel生成编译文件权限问题

    sudo -unobody ./artisan optimize # 避免`fpm`账户无权限修改缓存文件的问题.这里的`nobody`改成实际的`fpm`用户名.

  5. MySQL数据库安装(CentOS操作系统/tar.gz方式)

    1. 上传Mysql安装包“mysql-5.5.40-linux2.6-x86_64.tar.gz”到部署机,位置任意: 2. 将Mysql安装包解压到其所在目录,命令如下: -linux2.-x86 ...

  6. Openjudge-NOI题库-Pell数列

    题目描述 Description Pell数列a1, a2, a3, ...的定义是这样的,a1 = 1, a2 = 2, ... , an = 2 * an − 1 + an - 2 (n > ...

  7. eclipse 导入tomcat7源码

    导入tomcat的源码其实说简单也不简单,说不简单也简单,主要还是环境问题,中间花费了我很多时间,网上找了很多都没什么用,参考一些文章,然后自己慢慢摸索出来的. 环境:(1)jdk:jdk1.6.0_ ...

  8. C#第十一天(winform)

    1.MD5 namespace MD5加密与解密 { class Program { static void Main(string[] args) { "); Console.WriteL ...

  9. Dynamics CRM 相关资料

    links: 1.The Microsoft Dynamics CRM Team Blog 2.申请试用Dynamics CRM 2013 http://www.microsoft.com/zh-cn ...

  10. md5证书在window2012不能访问

    之前在window 2008使用makecert的产生的证书,部署到window 2012后,发现只有IE能访问,但是Firefox和chrome都不行.Firefox可以使用about:config ...