[AC 자동 동기] hdoj 3065: 바이러스 침입 지속 중
n 개의 패턴 문자열, 하나의 텍스트 문자열 을 보 여 줍 니 다. 각각 텍스트 문자열 이 패턴 문자열 에 나타 나 는 횟수 를 구 합 니 다.
대체적인 사고방식:
기본 적 인 AC 자동 동 기 는 일부 부분 을 수정 해 야 한다.
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include <algorithm>
using namespace std;
const int inf=1<<28;
const int nMax=1500;
const int mMax=2000000;
class node{
public:
int id;
int count; //
node *next[30],*fail;
node(){
id=-1;
count=0;
fail=NULL;
for(int i=0;i<30;i++)next[i]=NULL;
}
}*root,*que[mMax];
int cnt;
void insert(char *s){ //
int i;
node *r=root;
int l=strlen(s);
for(i=0;i<l;i++){
int loc=s[i]-'A';
if(r->next[loc]==NULL){
r->next[loc]=new node();
}
r=r->next[loc];
}
if(r->id==-1){
r->id=cnt;
cnt++;
}
r->count++;
}
void acAuto(){ // bfs fail
int i,head=0,tail=0;
node *p,*tmp;
root->fail=NULL;
que[tail++]=root;
while(head<tail){
tmp=que[head++];
for(i=0;i<30;i++){
if(tmp->next[i]==NULL)continue;
if(tmp==root){
tmp->next[i]->fail=root;
}
else {
for(p=tmp->fail;p!=NULL;p=p->fail){
if(p->next[i]!=NULL){
tmp->next[i]->fail=p->next[i];
break;
}
}
if(p==NULL){
tmp->next[i]->fail=root;
}
}
que[tail++]=tmp->next[i];
}
}
}
int vis[nMax];
void search(char *msg){
int i,idx;
node *p=root,*tmp;
for(i=0;msg[i];i++){
idx=msg[i]-'A';
if(idx<0||idx>26)idx=27;
while(p->next[idx]==NULL&&p!=root){
p=p->fail;
}
p=p->next[idx];
if(p==NULL)p=root;
for(tmp=p;tmp!=NULL;tmp=tmp->fail){//&&tmp->count!=-1
if(tmp->id!=-1)vis[tmp->id]++; // ,
}
}
}
char str[nMax][55],text[mMax];
int main(){
int n,i,j,flag;
while(scanf("%d",&n)!=EOF){
cnt=1;
root=new node();
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++){
scanf("%s",str[i]);
insert(str[i]);
}
acAuto();
scanf("%s",text);
search(text);
flag=1;
for(i=1;i<=n;i++){
if(vis[i]!=0){
flag=0;
printf("%s: %d
",str[i],vis[i]);
}
}
if(flag)printf("
");
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
hdu 1233 절 대 컴퓨터 대학원 재시험모 성에 서 마을 의 교통 상황 을 조사 하여 얻 은 통계표 에는 임의의 두 마을 간 의 거리 가 열거 되 어 있다.성 정부의 '원활 한 공사' 목 표 는 성 전체의 어느 두 마을 간 에 도 도로 교통 을 실현 할 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.