【模板】ac自动机

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
int n, cnt[200];
char temp[200][100];
struct node{
    int nex[maxn][26], val[maxn], f[maxn], last[maxn];
    int root, L;
    int newnode() {
        for(int i = 0; i < 26; i++) nex[L][i] = 0;
        val[L] = 0;
    return L++;
    }
    void init() {
        L = 0;
        root = newnode();
        memset(cnt, 0, sizeof(cnt));
    }
    void insert(char *s, int x) {
        int len = strlen(s), u = root;
        for(int i = 0; i < len; i++) {
            int c = s[i] - 'a';
            if(!nex[u][c]) nex[u][c] = newnode();
            u = nex[u][c];
        }
        val[u] = x;
    }
    void getfail() {
        queue<int>Q;
        Q.push(root);
        while(!Q.empty()) {
            int u = Q.front(), k = f[u];Q.pop();
            for(int i = 0; i < 26; i++) {
                int v = nex[u][i];
                if(!v){nex[u][i] = nex[k][i]; continue;}
                Q.push(v);
                f[v] = u?nex[k][i]:0;
                last[v] = val[f[v]]?f[v]:last[f[v]];
            }
        }
    }
    void query(char *s) {
        int len = strlen(s), u = root, res = 0;
        for(int i = 0; i < len; i++) {
            int c = s[i] - 'a';
            u = nex[u][c];
            if(val[u]) cnt[val[u]]++;
            int v = last[u];
            while(v) {
                if(val[v]) cnt[val[v]]++;
                v = last[v];
            }
        }
        for(int i = 1; i <= n; i++) res = max(res, cnt[i]);
        printf("%d\n", res);
        for(int i = 1; i <= n; i++)if(cnt[i] == res) printf("%s\n", temp[i]);
    }
}ac;
char s[maxn];
void solve() {
    ac.init();
    for(int i = 1; i <= n; i++) {
    	scanf("%s", temp[i]);
    	ac.insert(temp[i], i);
    }
    ac.getfail();
    scanf("%s", s);
    ac.query(s);
    return;
}

int main() {
    while(scanf("%d", &n) == 1 && n) {
        solve();
    }
    return 0;
}
(1)普通用户端(Web 交互平台) 热门话题总览: 实时榜单:展示 "热搜榜 TOP50"(每 10 分钟更新),包含话题名称、热度值、上升速度、持续时间,支持按 "社会 / 娱乐 / 科技" 等类别筛选。 话题卡片:每个话题以卡片形式展示核心信息,悬停显示 "相关话题、参与人数、情感倾向分布",点击进入详情页。 基础可视化浏览: 趋势图表:热门话题的 "热度随时间变化折线图"(支持选择 1 小时 / 24 小时 / 7 天时间范围)、"情感占比饼图"。 互动数据:展示话题相关微博的 "转发 / 评论 / 点赞总量对比" 柱状图,突出 "高互动量节点"(如某明星发布相关微博的时间点)。 (2)媒体工作者端(Web 平台) 深度分析功能: 多维度筛选:支持按 "时间范围、用户粉丝量、地域分布" 筛选话题数据,生成 "不同时段情感变化"、"各省市讨论热度" 等细分图表。 话题关联分析:展示 "核心话题与相关子话题的关联网络"(力导向图),标注 "关联强度"(线条粗细)和 "互动量占比"。 报告导出功能: 图表导出:支持将可视化图表导出为 "PNG(高清)/SVG(矢量)/PDF" 格式,保留数据来源标注(如 "数据采集时间:2024-10-01")。 分析简报:自动生成包含 "话题概述、核心发现、数据图表" 的简报文档(Word/PDF),支持添加自定义分析结论。 (3)数据分析人员端(Web+Jupyter) 高级分析工具: 自定义分析:通过 Jupyter Notebook 集成的 Python 分析环境(预装 pandas/matplotlib/seaborn),编写脚本处理原始数据,支持调用系统 API 获取指定话题数据。 模型参数调整:对情感分析模型、话题聚类算法进行参数优化(如调整 LDA 模型的主题数量),测试不同参数对分析结果的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值