本篇文章是一篇关于模板统计的帖子
统计文本中模板单词的涌现频率。
AC自动机模板题:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <map> #include <queue> #include <algorithm> using namespace std; #define SIGMA_SIZE 26 #define MAXNODE 20000 #define TEXT_SIZE 1000005 #define P_SIZE 80 #define P_NUM 160 map<string,int> ms; struct AcCorsickAutomata { int cnt[P_NUM]; int sz; int ch[MAXNODE][SIGMA_SIZE]; int f[MAXNODE]; int val[MAXNODE]; int last[MAXNODE]; void init() { sz = 1; memset(ch[0],0,sizeof(ch[0])); memset(cnt,0,sizeof(cnt)); ms.clear(); } int idx(char c) { return c - 'a'; } void insert(char *s,int v) { int u = 0,n = strlen(s); for(int i=0; i<n; i++) { int c = idx(s[i]); if(!ch[u][c]) { memset(ch[sz],0,sizeof(ch[sz])); val[sz] = 0; ch[u][c] = sz++; } u = ch[u][c]; } val[u] = v; ms[string(s)] = v; } void print(int j) { if(j) { cnt[val[j]]++; print(last[j]); } } void find(char *T) { int n = strlen(T); int j = 0; for(int i=0; i<n; i++) { int c = idx(T[i]); while(j && !ch[j][c]) j = f[j]; j = ch[j][c]; if(val[j]) print(j); else if(last[j]) print(last[j]); } } void getFail() { queue<int> q; f[0] = 0; for(int c = 0; c<SIGMA_SIZE; c++) { int u = ch[0][c]; if(u) { f[u] = 0; q.push(u); last[u] = 0; } } while(!q.empty()) { int r = q.front(); q.pop(); for(int c = 0; c<SIGMA_SIZE; c++) { int u = ch[r][c]; if(!u) continue; q.push(u); int v = f[r]; while(v && !ch[v][c]) v = f[v]; f[u] = ch[v][c]; last[u] = val[f[u]] ? f[u] : last[f[u]]; } } } }; AcCorsickAutomata ac; char text[TEXT_SIZE],p[P_NUM][P_SIZE]; int main() { /*#ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif*/ int n; while(scanf(" %d",&n)!=EOF && n!=0) { ac.init(); for(int i=1; i<=n; i++) { scanf(" %s",p[i]); ac.insert(p[i],i); } scanf(" %s",text); ac.getFail(); ac.find(text); int best = -1; for(int i=1; i<=n; i++) { if(ac.cnt[i] > best) best = ac.cnt[i]; } printf("%d\n",best); for(int i=1; i<=n; i++) { if(ac.cnt[ms[string(p[i])]] == best) printf("%s\n",p[i]); } } return 0; }
文章结束给大家分享下程序员的一些笑话语录:
开发时间
项目经理: 如果我再给你一个人,那可以什么时候可以完工?程序员: 3个月吧!项目经理: 那给两个呢?程序员: 1个月吧!
项目经理: 那100呢?程序员: 1年吧!
项目经理: 那10000呢?程序员: 那我将永远无法完成任务.
---------------------------------
原创文章 By
模板和统计
---------------------------------