hdoj 3065 ac自动机

本文详细介绍了裸AC自动机的实现过程,包括插入、AC自动机构建与查询操作,适用于字符串匹配等场景。

算是比较裸的ac自动机


#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
struct cnode
{
    char STR[52];
    int ans;
}node[1010];
struct trie
{
    trie* next;
    int isend;
    int map;//往root走到当前的结点,trie树上记录的串的映射,对应node的下标
    trie* child[26];
    trie()
    {
        isend = 0;
        map = 0;
        memset(child,NULL,sizeof(child));
        next = NULL;
    }
}*root,Tnum[160000];
int cnt;
void insert(char* str,int INDEX)
{
    int num;
    int len;
    trie* ptr;
    ptr = root;
    int i;
    len = strlen(str);
    for(i = 0;i < len;i++)
    {
        num = str[i] - 'A';
        if(ptr->child[num] == NULL)
        {
            ptr->child[num] = &Tnum[++cnt];//减少new的时间花费
        }
        ptr = ptr->child[num];
    }
    ptr -> isend ++;
    /*    if(ptr->isend>1)
      {
        cout<<"yes"<<endl;
        }*/
    ptr->map = INDEX; 
}
void ac_automation()
{
    int i;
    queue<trie*> qu;
    trie* current=NULL;
    qu.push(root);
    trie* fail = NULL;
    while(!qu.empty())
    {
        current = qu.front();
        qu.pop();
        for(i = 0;i < 26;i++)
        {
            if(current->child[i] != NULL)
            {
                fail =current->next;
                if(current == root)
                {
                    current->child[i]->next = root;
                    qu.push(current->child[i]);
                    continue;
                }
                
                while(1)
                {
                    if(fail == NULL)
                    {
                        current->child[i]->next = root;
                        break;
                    }
                    else
                    {
                        if(fail->child[i] != NULL)
                        {
                            current->child[i]->next = fail->child[i];
                            break;
                        }
                    }
                    fail = fail->next;
                }
                qu.push(current->child[i]);
            }
        }
    }
    
}
char text[2000010];
int ans;
void query()
{
    int len;
    len=strlen(text);
    trie* ptr;
    ptr = root;
    int num;
    int i;
    trie* temp;
    for(i = 0;i<len;i++)
    {
        if(text[i]>='A'&&text[i]<='Z')
        {
            num = text[i]-'A';
        }
        else
        {
            ptr = root;
            continue;
        }
        while(ptr->child[num] ==NULL && ptr!=root)
        {
            ptr = ptr->next;
        }
        ptr = ptr->child[num];
        if(ptr == NULL)
        {
            ptr = root;
        }
        temp = ptr;
        while(temp!=root &&temp->isend !=-1)
        {
            node[temp->map].ans+=temp->isend;
            //    temp->isend = -1;
            temp = temp->next;
        }
    }
}
int main()
{
    int n;
    int i;
    char str[52];
    while(scanf("%d",&n)!=EOF)
      {
        memset(Tnum,NULL,sizeof(Tnum));
        root = &Tnum[0];//减少new的时间花费
        cnt=0;
        for(i=0;i<n;i++)
        {
            scanf("%s",node[i].STR);
            node[i].ans =0;
            insert(node[i].STR,i);
            
        }
        getchar();
        ac_automation();
    //    scanf("%s",text);
        gets(text);
        query();
        for(i=0;i<n;i++)
        {
            if(node[i].ans != 0)
            {
                printf("%s: %d\n",node[i].STR,node[i].ans);
            }
        }
      }
    
    return 0;
}


基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究(Matlab代码实现)内容概要:本文围绕&ldquo;基于数据驱动的 Koopman 算子的递归神经网络模型线性化,用于纳米定位系统的预测控制研究&rdquo;展开,提出了一种结合数据驱动方法与Koopman算子理论的递归神经网络(RNN)模型线性化方法,旨在提升纳米定位系统的预测控制精度与动态响应能力。研究通过构建数据驱动的线性化模型,克服了传统非线性系统建模复杂、计算开销大的问题,并在Matlab平台上实现了完整的算法仿真与验证,展示了该方法在高精度定位控制中的有效性与实用性。; 适合人群:具备一定自动化、控制理论或机器学习背景的科研人员与工程技术人员,尤其是从事精密定位、智能控制、非线性系统建模与预测控制相关领域的研究生与研究人员。; 使用场景及目标:①应用于纳米级精密定位系统(如原子力显微镜、半导体制造设备)中的高性能预测控制;②为复杂非线性系统的数据驱动建模与线性化提供新思路;③结合深度学习与经典控制理论,推动智能控制算法的实际落地。; 阅读建议:建议读者结合Matlab代码实现部分,深入理解Koopman算子与RNN结合的建模范式,重点关注数据预处理、模型训练与控制系统集成等关键环节,并可通过替换实际系统数据进行迁移验证,以掌握该方法的核心思想与工程应用技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值