HDUOJ:1277(AC auto)

本文介绍了一个使用AC自动机实现的字符串匹配程序。该程序能够高效地处理大量关键词,并能在目标文本中查找并按序输出所有关键词,确保了查找结果的唯一性和准确性。文章通过具体的代码实现了AC自动机的构建、失败指针的设置以及关键词的查找。

按序输出,不重复:

#include <bits/stdc++.h>
using namespace std;
const char base = '0';
const int maxkind = 10;
const int maxchar = 60005;
const int maxword = 10002;

char target[maxchar];
char words[maxword][62];
int trie[600002][maxkind];
int fail[600002];
int isword[600002];
int color[600002];
queue<int> q;
queue<int> res;
int cnt = 1;
int m,n;

void ACtrie(){
    int p,l,c;
    for(int i=1;i<=n;i++){
        l = strlen(words[i]);
        p = 0;
        for(int j=0;j<l;j++){
            c = words[i][j] - base;
            if(trie[p][c] !=0 ) p = trie[p][c];
            else p = trie[p][c] = cnt++;
        }
        isword[p] = i;
    }
}
void ACfail(){
    while(!q.empty()) q.pop();
    q.push(0);
    int p ;
    while(!q.empty()){
        p = q.front();
        q.pop();
        int fp = fail[p];
        for(int i=0;i<maxkind;i++){
            if(trie[p][i] != 0) q.push(trie[p][i]);
            if(trie[p][i] != 0 && trie[fp][i] !=0 && p!=fp){
                fail[trie[p][i]] = trie[fp][i];
            }
            if(trie[p][i] == 0){
                trie[p][i] = trie[fp][i];
            }
        }
    }
}
void ACfind(){
    while(!res.empty()) res.pop();
    int l = strlen(target);
    int p = 0;
    for(int i=0;i<l;i++){
        int c = target[i] - base;
        p = trie[p][c];
        int t = p;
        while(color[t] == 0&&t!=0){
            color[t] = 1;
            if(isword[t] != 0) res.push(isword[t]);
            t = fail[t];
        }
    }
}
void print(){
    printf("Found key:");
    while(!res.empty()){
        printf(" [Key No. %d]",res.front());
        res.pop();
    }
    printf("\n");
}

int main(){
    freopen("input.txt","r",stdin);
    memset(target,0,sizeof(target));
    memset(words,0,sizeof(words));
    memset(trie,0,sizeof(trie));
    memset(fail,0,sizeof(fail));
    memset(isword,0,sizeof(isword));
    memset(color,0,sizeof(color));
    scanf("%d%d",&m,&n);
    while(m--){
        char t[65];
        scanf("%s",t);
        sprintf(target,"%s%s",target,t);
    }
    for(int i=1;i<=n;i++){
        char c;
        while((c = getchar()) !=']');
        scanf("%s",words[i]);
    }
    ACtrie();
    ACfail();
    ACfind();
    print();
    return 0;
}
MATLAB代码实现了一个基于多种智能优化算法优化RBF神经网络的回归预测模型,其核心是通过智能优化算法自动寻找最优的RBF扩展参数(spread),以提升预测精度。 1.主要功能 多算法优化RBF网络:使用多种智能优化算法优化RBF神经网络的核心参数spread。 回归预测:对输入特征进行回归预测,适用于连续值输出问题。 性能对比:对比不同优化算法在训练集和测试集上的预测性能,绘制适应度曲线、预测对比图、误差指标柱状图等。 2.算法步骤 数据准备:导入数据,随机打乱,划分训练集和测试集(默认7:3)。 数据归一化:使用mapminmax将输入和输出归一化到[0,1]区间。 标准RBF建模:使用固定spread=100建立基准RBF模型。 智能优化循环: 调用优化算法(从指定文件夹中读取算法文件)优化spread参数。 使用优化后的spread重新训练RBF网络。 评估预测结果,保存性能指标。 结果可视化: 绘制适应度曲线、训练集/测试集预测对比图。 绘制误差指标(MAE、RMSE、MAPE、MBE)柱状图。 十种智能优化算法分别是: GWO:灰狼算法 HBA:蜜獾算法 IAO:改进天鹰优化算法,改进①:Tent混沌映射种群初始化,改进②:自适应权重 MFO:飞蛾扑火算法 MPA:海洋捕食者算法 NGO:北方苍鹰算法 OOA:鱼鹰优化算法 RTH:红尾鹰算法 WOA:鲸鱼算法 ZOA:斑马算法
<think>嗯,用户想查询HDUOJ编号2000的题目信息和解法。首先我需要确定这个题目的具体内容。不过根据用户提供的引用信息,现有的引用并没有直接提到2000号题目。引用[1]、[2]、[3]、[4]提到了其他题号,比如1015、797,还有一些时间限制的信息,但2000号题目不在其中。 不过,根据常见的OJ题目编号规律,HDUOJ的2000题可能是一个入门级别的题目,比如可能涉及基础编程问题。例如,HDU的2000题通常是ASCII码排序的问题。用户可能需要这道题的描述和解决方法。 我需要确认题目的正确性。通常,HDU 2000的题目描述是:输入三个字符,按ASCII码顺序升序输出这三个字符,字符之间用空格分隔。例如输入“cab”,输出“a b c”。 接下来,用户可能需要解法思路。对于这个问题,可以使用基本的排序方法,比如比较交换法或者直接调用内置排序函数。代码实现的话,可以用C语言或者Python。例如,C语言中读取三个字符,排序后输出;Python中可以用sorted函数处理。 还需要注意输入输出的格式,比如输入可能是一个连续的字符串,需要拆分成三个字符,或者逐个读取。此外,处理输入时的空格或换行符也要小心。 可能用户遇到的常见问题包括输入处理错误,排序逻辑错误,或者输出格式不符合要求。比如在C语言中使用scanf读取时,需要注意缓冲区的问题,或者Python中使用input().split()可能不正确,需要直接读取字符串并拆分字符。 所以,在回答中需要详细说明输入的处理步骤,排序方法的选择,以及正确输出的格式。同时,提供示例代码帮助用户理解。此外,提醒用户注意不同编程语言中的输入输出细节,避免常见错误。 最后,生成相关问题,帮助用户进一步巩固相关知识,比如其他排序问题、ASCII码的应用,或者不同OJ平台的题目差异等。</think>关于HDUOJ 2000号题目的信息及解法分析如下: ### 题目描述 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符,字符之间以空格分隔(原题为HDU 2000: ASCII码排序)[^2]。 ### 输入输出示例 输入:`cab` 输出:`a b c` ### 解题思路 1. **输入处理**:读取连续三个字符(无需分隔) 2. **排序方法**:直接比较字符的ASCII值 - 方法1:三次比较交换实现冒泡排序 - 方法2:使用内置排序函数(如Python的`sorted()`) 3. **输出格式**:按顺序输出字符并用空格分隔 ### 代码实现(Python示例) ```python while True: try: chars = input().strip() a, b, c = sorted(chars) print(f"{a} {b} {c}") except: break ``` ### 注意事项 - 输入可能包含不可见字符,需使用`strip()`过滤 - 多组测试数据需用循环处理,直到EOF - C语言版本需注意`scanf`读取时的格式控制符应为`%c%c%c` ### 复杂度分析 - 时间复杂度:$O(1)$(固定三次比较) - 空间复杂度:$O(1)$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值