#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#pragma warning (disable : 4996)
using namespace std;
const int Max = 50005;
int Next[Max][128], Fail[Max], End[Max];
int L, root;
char str[1010][100];
int Newnode()
{
for (int i = 0; i < 128; i++)
Next[L][i] = -1;
End[L++] = -1;
return L - 1;
}
void Init()
{
L = 0;
root = Newnode();
}
void Insert(char buf[],int id)
{
int len = strlen(buf);
int now = root;
for (int i = 0; i < len; i++)
{
if (Next[now][buf[i]] == -1)
Next[now][buf[i]] = Newnode();
now = Next[now][buf[i]];
}
End[now]= id;
}
void Build()
{
queue<int>Q;
Fail[root] = root;
for (int i = 0; i < 128; i++)
if (Next[root][i] == -1)
Next[root][i] = root;
else
{
Fail[Next[root][i]] = root;
Q.push(Next[root][i]);
}
while (!Q.empty())
{
int now = Q.front();
Q.pop();
for (int i = 0; i < 128; i++)
if (Next[now][i] == -1)
Next[now][i] = Next[Fail[now]][i];
else
{
Fail[Next[now][i]] = Next[Fail[now]][i];
Q.push(Next[now][i]);
}
}
}
int num[1010];
void Query(char buf[], int n)
{
for (int i = 0; i < n; i++)
num[i] = 0;
int len = strlen(buf);
int now = root;
for (int i = 0; i < len; i++)
{
now = Next[now][buf[i]];
int temp = now;
while (temp != root)
{
if (End[temp] != -1)
num[End[temp]]++;
temp = Fail[temp];
}
}
for (int i = 0; i < n; i++)
if (num[i]>0)
printf("%s: %d\n", str[i], num[i]);
}
char buf[2000010];
int main()
{
int n;
while (~scanf("%d", &n))
{
Init();
for (int i = 0; i < n; i++)
{
scanf("%s", str[i]);
Insert(str[i], i);
}
Build();
scanf("%s", buf);
Query(buf, n);
}
return 0;
}
hdu 3065
最新推荐文章于 2020-02-07 11:05:28 发布