hdu 3065 AC 자동 동기
제목: 먼저 단 어 를 제시 한 다음 에 문장 을 제시 하고 모든 단어 가 문장 에 나타 난 횟수 를 통계 하고 출력 한다.
#include"iostream"
#include"cstdio"
#include"cstring"
#include"queue"
using namespace std;
char word[1005][55],article[2000005];
int cnt[1005];
//
struct node
{
int num;// num
node* next[26];
node* fail;
node(){ // ,
num=-1;
fail=NULL;
memset(next,NULL,sizeof(next));
}
};
//
void insert(int num,char* str,node* root)
{
int i,n=strlen(str);
node* p=root;
for(i=0;i<n;i++){
int k=str[i]-'A';
if(p->next[k]==NULL){
p->next[k]=new node();
}
p=p->next[k];
}
p->num=num;// num
}
// fail
void makeFail(node* root)
{
queue<node*>q;
q.push(root);
while(!q.empty()){
node* front=q.front();
q.pop();
for(int i=0;i<26;i++){
if(front->next[i]!=NULL){
node *temp=front->fail;
while(temp!=NULL){
if(temp->next[i]!=NULL){
front->next[i]->fail=temp->next[i];
break;
}
temp=temp->fail;
}
if(temp==NULL)
front->next[i]->fail=root;
q.push(front->next[i]);
}
}
}
}
//
void search(char* str,node* root)
{
int i,n=strlen(str);
node* p=root;
for(i=0;i<n;i++){
if(str[i]<'A'||str[i]>'Z'){// , root
p=root;
continue;
}
int k=str[i]-'A';
while(p!=root&&p->next[k]==NULL)
p=p->fail;
if(p->next[k]!=NULL){
p=p->next[k];
node* temp=p;
while(temp!=root){
if(temp->num!=-1) // num
cnt[temp->num]++;
temp=temp->fail;
}
}
}
}
//
void freedom(node* p)
{
for(int i=0;i<26;i++){
if(p->next[i]!=NULL)
freedom(p->next[i]);
}
delete p;
}
//
int main()
{
int T,i;
while(scanf("%d",&T)!=EOF){
memset(cnt,0,sizeof(cnt));
node* root=new node();
getchar();
for(i=0;i<T;i++){
gets(word[i]);
insert(i,word[i],root);
}
makeFail(root);
gets(article);
search(article,root);
for(i=0;i<T;i++){
if(cnt[i]>0)
printf("%s: %d
",word[i],cnt[i]);
}
freedom(root);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.