hdu 3065 바이러스 습격 지속 중
2914 단어 HDU
AC 자동 동기
코드:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<set>
#include<map>
#include<algorithm>
#define LL long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1005;
const int M=505;
const int K=26;
struct nodeTrie
{
nodeTrie()
{
v=0;
fail=NULL;
for(int i=0;i<K;++i)
next[i]=NULL;
}
int v;
nodeTrie *fail;
nodeTrie *next[K];
}*root;
char s[N][55];
char web[2000005];
int num[N];
void addWord(nodeTrie *p,char *s,int k)
{
if(s[0]=='\0') return ;
for(int i=0;s[i]!='\0';++i)
{
if(p->next[s[i]-'A']==NULL)
p->next[s[i]-'A']=new nodeTrie;
p=p->next[s[i]-'A'];
}
(p->v)=k;
}
void init(int n)
{
root=new nodeTrie;
for(int i=1;i<=n;++i)
{
gets(s[i]);
addWord(root,s[i],i);
}
}
void bfs(nodeTrie *p)
{
p->fail=root;
queue<nodeTrie *>qt;
qt.push(p);
while(!qt.empty())
{
nodeTrie *y;
nodeTrie *x=qt.front();qt.pop();
for(int i=0;i<K;++i)
if(x->next[i]!=NULL)
{
qt.push(x->next[i]);
if(x==root)
{x->next[i]->fail=root;continue;}
y=x->fail;
while(y!=root&&y->next[i]==NULL)
y=y->fail;
if(y->next[i]!=NULL)
x->next[i]->fail=y->next[i];
else
x->next[i]->fail=root;
}
}
}
int match(nodeTrie *p,char *s)
{
int wordCount=0;
int l=0;
while(s[l]!='\0')
{
if(s[l]<'A'||s[l]>'Z') {p=root;++l;continue;}
while(p->next[s[l]-'A']==NULL&&p!=root)
p=p->fail;
if(p->next[s[l]-'A']!=NULL)
p=p->next[s[l]-'A'];
++l;
nodeTrie *fp=p;
while(fp!=root)
{
if((fp->v)>0)
++num[fp->v];
fp=fp->fail;
}
}
return wordCount;
}
int main()
{
//freopen("data.in","r",stdin);
int n;
while(scanf("%d ",&n)!=EOF)
{
init(n);
bfs(root);
gets(web);
memset(num,0,sizeof(num));
match(root,web);
for(int i=1;i<=n;++i)
if(num[i]>0)
printf("%s: %d
",s[i],num[i]);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[HDU] 4089 활성화 확률 DPdp[i][j]를 모두 i개인의 대기열인 Tomato가 j위 서버가 마비될 확률로 역추를 사용하면 우리는 상태 이동 방정식을 얻을 수 있다. i == 1 : dp[1][1] = dp[1][1] * p1 + dp[1]...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.