首页 > 其他分享 >AC自动机

AC自动机

时间:2024-04-22 12:22:55浏览次数:22  
标签:AC int son vis maxn && ans 自动机

二次加强版那个题
距离最大内存,就差了一个ss数组了....96分

#include<bits/stdc++.h>
#define maxn 2000001
using namespace std;
string ss[100000];
char s[maxn],T[maxn];
int n,cnt,vis[200051],ans,in[maxn],Map[maxn];
struct kkk{
    int son[26],fail,flag,ans;
    void clear(){memset(son,0,sizeof(son)),fail=flag=ans=0;}
}trie[maxn];
queue<int>q;
//int getnum(char x){
//    if(x>='A'&&x<='Z')
//        return x-'A';
//    else if(x>='a'&&x<='z')
//        return x-'a'+26;//由于这个26,对于最大值那个问题,这个位置并不适用 
//    else
//        return x-'0'+52;
//} 
void insert(char* s,int num){
    int u=1,len=strlen(s);
    for(int i=0;i<len;i++){
//        int v=getnum(s[i]);
		int v=s[i]-'a';//只有字母 
        if(!trie[u].son[v])trie[u].son[v]=++cnt;
        u=trie[u].son[v];
    }
    if(!trie[u].flag)trie[u].flag=num;
    Map[num]=trie[u].flag;
}
void getFail(){
    for(int i=0;i<26;i++)trie[0].son[i]=1;
    q.push(1);
    while(!q.empty()){
        int u=q.front();q.pop();
        int Fail=trie[u].fail;
        for(int i=0;i<26;i++){
            int v=trie[u].son[i];
            if(!v){trie[u].son[i]=trie[Fail].son[i];continue;}
            trie[v].fail=trie[Fail].son[i]; in[trie[v].fail]++;
            q.push(v);
        }
    }
}
void topu(){
    for(int i=1;i<=cnt;i++)
    if(in[i]==0)q.push(i);
    while(!q.empty()){
        int u=q.front();q.pop();vis[trie[u].flag]=trie[u].ans;
        int v=trie[u].fail;in[v]--;
        trie[v].ans+=trie[u].ans;
        if(in[v]==0)q.push(v);
    }
}
void query(char* s){
    int u=1,len=strlen(s);
    for(int i=0;i<len;i++)
    u=trie[u].son[s[i]-'a'],trie[u].ans++;
}
int main(){
while(scanf("%d",&n))
{
	for(int i=0;i<=1000000;i++)
	{
		trie[i].clear();
	}
	if(n==0)
	return 0;
	    cnt=1;
    for(int i=1;i<=n;i++){
        scanf("%s",s);
        ss[i]=s;
        insert(s,i);
    }getFail();scanf("%s",T);
    query(T);topu();
    
    
    
/*输出实体,输出最大值*/
    vector<int> damn(vis,vis+n+1);//保存个数 (因为Map和vis有个对应关系) 
    sort(&vis[1],&vis[n+1]);//得到最大的个数 
    cout<<vis[n]<<endl;
    for(int i=1;i<=n;i++)
	{
		if(damn[Map[i]]==vis[n])//如果 
		cout<<ss[Map[i]]<<endl;
	}
 } 





//i:字符串的编号 
/*就是在个数和实体之间用Map[i]代替i了,但前提是vis和ss都不能变*/
//vis[Map[i]]  第i个字符串的个数 
//ss[Map[i]]   第i个字符串的实体 


    
/*输出每个字符串出现的次数*/
//  for(int i=1;i<=n;i++)printf("%d\n",vis[Map[i]]);






/*输出有多少个出现过*/
/*不怕重复的字符串了*/
//	int hh=0;
//	for(int i=1;i<=n;i++)
//	{
//		if(vis[Map[i]]>0)
//		hh++;
//	}
//	printf("%d",hh);
}



标签:AC,int,son,vis,maxn,&&,ans,自动机
From: https://www.cnblogs.com/yzzyang/p/18150391

相关文章

  • 在macOS上管理MongoDB:服务和手动后台进程
    MongoDB是一个功能强大的开源NoSQL数据库,因其可扩展性和性能而受到青睐。macOS用户可以将MongoDB配置为服务运行,或者手动将其作为后台进程运行。本文将详细介绍如何在macOS上使用MongoDB7.0版本进行这两种操作。将MongoDB作为macOS服务运行为了便捷性和确保MongoDB持续运行,macO......
  • Java开启事务(@Transactional)
    开始事务的代码可以使用Spring的事务管理器来实现。具体步骤如下:1.在Spring配置文件中配置事务管理器和事务通知器:```<beanid="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><propertyname="dataSource"ref="......
  • 技术主管问我 PHP的opcache 是用来干嘛的 ?
    更多:https://www.shanhubei.com/archives/55271.htmlopcache从字面意思,肯定是缓存这一块的。但是你是否知道它的工作原理是怎样的呢?这里一点一点让你了解!PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PHP性能不可缺失的......
  • Java中用forEach和lamad优化for循环
    1importjava.util.Arrays;2importjava.util.List;3importjava.util.function.IntBinaryOperator;456List<String>names=Arrays.asList("Alice","Bob","Charlie");78//方式一for输出9for(inti=0;i<......
  • 掌控基础设施,加速 DevOps 之旅:IaC 深度解析
    在当今的DevOps世界中,基础设施即代码(IaC)是一个非常重要的概念。它在整个行业几乎无处不在,是现代工程角色的绝对关键。 本文将主要包含IaC的定义和它的好处,同时将Walrus作为最佳实践来进行详细讲解。 什么是基础设施即代码(IaC)用最简单的话来说,就是使用代码定义需要在......
  • row cache lock 事后分析处理
    现场同事告知oracle19C下生产大量trc文件,把oracle目录撑爆查看trc文件如下kqrpre:keymismatchpo=0x132745948hash=27d744ca----------------------------------------SO:0x12a9d2098,type:rowcacheenqueues(111),map:0x17537fa88state:LIVE(0x4532),fl......
  • web server apache tomcat11-14-CGI
    前言整理这个官方翻译的系列,原因是网上大部分的tomcat版本比较旧,此版本为v11最新的版本。开源项目从零手写实现tomcatminicat别称【嗅虎】心有猛虎,轻嗅蔷薇。系列文章webserverapachetomcat11-01-官方文档入门介绍webserverapachetomcat11-02-setup启动web......
  • 使用 apache pdfbox 去除水印
    需求学习cobol过程中,找了一本电子书,但是有水印。WPS可以擦除,但是需要开通会员。能不能用java程序去除水印呢?实现先查阅一些资料,开拓视野。第一步:安装 org.apache.pdfbox:pdfbox-app:3.0.2,这是一个可执行jar,执行后可弹出Swing图形用户界面,可导入pdf文件后可查看其内部结......
  • Oracle JDK 和 OpenJDK 有什么区别?
    OpenJDK是Sun在2006年末把Java开源而形成的项目,这里的“开源”是通常意义上的源码开放形式,即源码是可被复用的,例如IcedTea、UltraViolet都是从OpenJDK源码衍生出的发行版。OracleJDK采用了商业实现,而OpenJDK使用的是开源的FreeType。当然,“相同”是建立在两者共有的组件基础上的,O......
  • 使用ollama分别在我的window、mac、小米手机上部署体验llama3-8b
    1、ollama到底是个什么玩意一句话来说,Ollama是一个基于Go语言开发的简单易用的本地大模型运行框架。可以将其类比为docker(有类似docker中的一些常规命令list,pull,push,run等等),事实上确实也制定了类似docker的一种模型应用标准,在后边的内容中,你能更加真切体会到这一点。......