zoukankan      html  css  js  c++  java
  • HDU 5384 字典树、AC自动机

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=5384

    用字典树、AC自动机两种做法都可以做

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<string>
     4 #include<iostream>
     5 using namespace std;
     6 struct node{
     7     int cnt;
     8     node *next[26];
     9     node(){
    10         cnt = 0;
    11         for(int i = 0;i<26;i++)
    12             next[i] = NULL;
    13     }
    14 }*a;
    15 void insert(char *str){
    16     node *head = a;
    17     int len = strlen(str);
    18     for(int i = 0;i<len;i++){
    19         int temp = str[i]-'a';
    20         if(head->next[temp] == NULL)
    21             head->next[temp] = new node;
    22         head = head->next[temp];
    23     }
    24     head->cnt++;
    25 }
    26 int find(string t){
    27     node *head = a;
    28     int ans = 0;
    29     for(int i = 0;i<t.size();i++){
    30         if(head->next[t[i]-'a']){
    31             if(head->next[t[i]-'a']->cnt){
    32                 ans++;
    33                 
    34             }
    35         }else
    36             break;
    37         head = head->next[t[i]-'a'];
    38     }
    39     head->cnt--;
    40     return ans;
    41 }
    42 int main(){
    43     int t;
    44     scanf("%d",&t);
    45     while(t--){
    46         a = new node;
    47         int n;
    48         scanf("%d",&n);
    49         char s[55];
    50         for(int i = 0;i<n;i++){
    51             scanf(" %s",s);
    52             insert(s);
    53         }
    54         string des;
    55         cin >> des;
    56         int ans = 0;
    57         for(int i = 0;i<des.size();i++){
    58             ans += find(des.substr(i));
    59         }
    60         printf("%d
    ",ans);
    61     }
    62     return 0;
    63 }
    字典树
     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<string>
     4 #include<iostream>
     5 using namespace std;
     6 struct node{
     7     int cnt;
     8     node *next[26];
     9     node(){
    10         cnt = 0;
    11         for(int i = 0;i<26;i++)
    12             next[i] = NULL;
    13     }
    14 }*a;
    15 void insert(char *str){
    16     node *head = a;
    17     int len = strlen(str);
    18     for(int i = 0;i<len;i++){
    19         int temp = str[i]-'a';
    20         if(head->next[temp] == NULL)
    21             head->next[temp] = new node;
    22         head = head->next[temp];
    23     }
    24     head->cnt++;
    25 }
    26 int find(string t){
    27     node *head = a;
    28     int ans = 0;
    29     for(int i = 0;i<t.size();i++){
    30         if(head->next[t[i]-'a']){
    31             if(head->next[t[i]-'a']->cnt){
    32                 ans++;
    33                 
    34             }
    35         }else
    36             break;
    37         head = head->next[t[i]-'a'];
    38     }
    39     head->cnt--;
    40     return ans;
    41 }
    42 int main(){
    43     int t;
    44     scanf("%d",&t);
    45     while(t--){
    46         a = new node;
    47         int n;
    48         scanf("%d",&n);
    49         char s[55];
    50         for(int i = 0;i<n;i++){
    51             scanf(" %s",s);
    52             insert(s);
    53         }
    54         string des;
    55         cin >> des;
    56         int ans = 0;
    57         for(int i = 0;i<des.size();i++){
    58             ans += find(des.substr(i));
    59         }
    60         printf("%d
    ",ans);
    61     }
    62     return 0;
    63 }
    AC自动机
  • 相关阅读:
    Linux Shell tr 命令详解
    Shell统计每个单词出现的个数
    启明4-29团队进度博客
    启明4-28团队进度博客
    启明4-27团队进度博客
    启明4-26团队进度博客
    启明4-25团队进度博客
    启明4-24团队博客
    每日总结8
    启明4-23团队进度博客
  • 原文地址:https://www.cnblogs.com/zqy123/p/5432707.html
Copyright © 2011-2022 走看看