• 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查看端口被占用等常用命令
    python批量修改文件内容及文件编码方式的处理
    为什么在Python里推荐使用多进程而不是多线程
    python小练习之读取文件写入excel
    python 小练习之生成手机号码
    python 小练习之删除文件夹下的所有文件,包括子文件夹中的文件
    python中 字符 字典 列表之间的转换
    统计表中 重复出现 XX次以上的数据
    java数据类型
    字符编码和python使用encode,decode转换utf-8, gbk, gb2312
  • 原文地址:https://www.cnblogs.com/zqy123/p/5432707.html
Copyright © 2020-2023  润新知