HDU 3065,模板(备忘录)
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; #define M 2222222 char sx[1111][128]; int n; char s[M]; struct Trie{ int ch[M][128],end[M],fail[M],cnt,root; int b[M]; int Newnode(){ cnt++; memset(ch[cnt],-1,sizeof(ch[cnt])); end[cnt]=-1; fail[cnt]=-1; return cnt; } void init(){ cnt=0; root=Newnode(); memset(b,0,sizeof(b)); } void insert(char *s,int x){ int len=strlen(s),pos=root; for (int i=0;i<len;i++){ int v=s[i]; if (ch[pos][v]==-1) ch[pos][v]=Newnode(); pos=ch[pos][v]; } end[pos]=x; } queue<int> Q; void get_fail() { fail[root]=root; for (int i=0;i<128;i++){ if (ch[root][i]==-1) ch[root][i]=root; else { fail[ch[root][i]]=root; Q.push(ch[root][i]); } } while (!Q.empty()){ int pos=Q.front(); Q.pop(); for (int i=0;i<128;i++) if (ch[pos][i]==-1) ch[pos][i]=ch[fail[pos]][i]; else { fail[ch[pos][i]]=ch[fail[pos]][i]; Q.push(ch[pos][i]); } } } void query(char *s1){ int len=strlen(s1),pos=root; for (int i=0;i<len;i++){ if (s1[i]<‘A‘||s1[i]>‘Z‘) {pos=root;continue;} int temp=ch[pos][s1[i]]; pos=temp; while (temp!=root){ if (end[temp]!=-1) b[end[temp]]++; temp=fail[temp]; } } for (int i=1;i<=n;i++) if (b[i]) printf("%s: %d\n",sx[i],b[i]); } }AC; int main(){ while (scanf("%d",&n)!=EOF) { AC.init(); for (int i=1;i<=n;i++) { scanf("%s",sx[i]); AC.insert(sx[i],i); } AC.get_fail(); scanf("%s",s); AC.query(s); } return 0; }
时间: 2024-10-14 13:39:59