2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))

//暴力,从每一行的开始处开始寻找要查询的字符
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

char str[100005];

int main(){
    while(gets(str)){
        for(int i=0; str[i]; ++i)
            if(str[i]==‘A‘){
                if(strstr(str+i, "Apple") == str+i)
                    printf("MAI MAI MAI!\n");
            }
            else if(str[i]==‘i‘){
                if(strstr(str+i, "iPhone") == str+i || strstr(str+i, "iPod") == str+i || strstr(str+i, "iPad") == str+i)
                    printf("MAI MAI MAI!\n");
            }
            else if(str[i]==‘S‘)
                if(strstr(str+i, "Sony") == str+i)
                    printf("SONY DAFA IS GOOD!\n");
    }
    return 0;
} 
 1 //将要匹配的字符串(也就是题目中查询文本中出现的5个单词)建立trie树,然后生成AC_自动机.....
 2 #include<iostream>
 3 #include<cstring>
 4 #include<queue>
 5 #include<cstdio>
 6 #include<algorithm>
 7 using namespace std;
 8
 9 int trie[30][200];
10 int vis[30], fail[6000];//vis标记的是单词的末尾字符所在的节点
11 char str[][10] = {"Apple", "iPhone", "iPod", "iPad", "Sony"};
12 int cnt;
13 void buildT(){
14     for(int i=0; i<5; ++i){
15         int u=0;
16         for(int j=0; str[i][j]; ++j){
17             if(trie[u][str[i][j]] == 0)
18                 trie[u][str[i][j]] = ++cnt;
19             u=trie[u][str[i][j]];
20         }
21         vis[u]=1;
22     }
23 }
24
25 void getFail(){
26     queue<int>q;
27     for(int i=0; i<200; ++i)
28         if(trie[0][i]) q.push(trie[0][i]);
29     while(!q.empty()){
30         int u = q.front();
31         q.pop();
32         int v;
33         for(int i=0; i<200; ++i)
34             if(v = trie[u][i]){
35                 fail[v] = trie[fail[u]][i];
36                 q.push(v);
37             }
38             else
39                 trie[u][i] = trie[fail[u]][i];
40     }
41 }
42
43 void getText(char *ch){
44     int u=0;
45     for(int i=0; ch[i]; ++i){
46         int v = trie[u][ch[i]];
47         u=v;
48         while(v){
49             if(vis[v] && (ch[i]==‘d‘ || ch[i]==‘e‘))
50                 printf("MAI MAI MAI!\n");
51             else if(vis[v] && ch[i]==‘y‘)
52                 printf("SONY DAFA IS GOOD!\n");
53             v = fail[v];
54         }
55     }
56 }
57
58 char text[10000];
59
60 int main(){
61     buildT();
62     getFail();
63     while(gets(text)){
64         getText(text);
65     }
66     return 0;
67 }
时间: 2024-10-09 12:10:34

2014 网选 5007 Post Robot(暴力或者AC_自动机(有点小题大作了))的相关文章

2014网选ZOJPretty Poem(暴力枚举)

/* 将给定的一个字符串分解成ABABA 或者 ABABCAB的形式! 思路:暴力枚举A, B, C串! */ 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<string> 5 6 using namespace std; 7 string str; 8 char ch[55]; 9 int main(){ 10 int t; 11 scanf("%d&

2014 网选 5024 Wang Xifeng&#39;s Little Plot

题意:从任意一个任意一个可走的点开始找一个最长的路,这条路如果有转弯的话, 那么必须是 90度,或者没有转弯! 思路: 首先用dfs将所有可走点开始的 8 个方向上的线段的最长长度求出来 ! step[i][j][k] 表示的是(i,j)沿着k方向一直走到头或者转弯时的最长步数! 最后枚举每一个可走点转弯为90度的路径,找到最长的长度! step[i][j][k1] + step[i][j][k2] 就是 (i, j)这个点 k1 和 k2方向构成90度! 1 #include<iostream

2014 网选 广州赛区 hdu 5023 A Corrupt Mayor&#39;s Performance Art

1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #define N 1000005 6 using namespace std; 7 8 int c[35]; 9 int tree[N*4];//正值表示该节点所管理的区间的颜色是纯色,-1表示的是非纯色 10 int n, m; 11 12 void buildT(int ld, int

2014 网选 5014 Number Sequence(异或)

1 /* 2 题意:a, b两个序列,规定由[0, n]区间的数! 3 求 a[i] ^ b[i] 的和最大! 4 5 思路:如果数字 n的二进制有x位, 那么一定存在一个数字m,使得n^m的所有二进制位 6 都是1,也就是由x位1!这样下去的到的值就是最大值! 7 8 */ 9 #include<iostream> 10 #include<cstring> 11 #include<cstdio> 12 #include<algorithm> 13 #def

2014 网选 5011 Game(Nim游戏,数学题)

/* 题意:Nim游戏! 思路:通过异或,判断将n个数表示成二进制的形式之后,是否对应位的数字1 的个数是偶数! */ #include<iostream> using namespace std; int main(){ int n, x, s; while(cin>>n){ s=0; while(n--){ cin>>x; s^=x; } if(s) cout<<"Win";//不是偶数 else cout<<"

2014 网选 上海赛区 hdu 5047 Sawtooth

题意:求n个'M'型的折线将一个平面分成的最多的面数! 思路:我们都知道n条直线将一个平面分成的最多平面数是 An = An-1 + n+1 也就是f(n) = (n*n + n +2)/2 对于一个'M'型的折线呢?它有四条线,但是由于三个顶点的关系导致划分的平面 的数目减少了9个!所以有递推公式 f(n) = (m*m + m + 2)/2 - 9*n; m = 4*n 最后 f(n) = (8*n+1)*(n-1)+2) 由于 n<=1e12 , 所以回报 long long!那么对于大于

2014 网选 5012 Dice(bfs模板)

1 /* 2 题意:就是给定两个筛子,每个筛子上6个面,每个面的数字属于[1,6], 且互不相同! 3 问a筛子最少经过按照题目规定的要求转动,达到和b筛子上下左右前后的数字相同! 4 5 思路:很直白的bfs,将每一种状态对应一个数字,保证这种状态不会重新加入队列中! 6 */ 7 #include<iostream> 8 #include<cstdio> 9 #include<cstring> 10 #include<algorithm> 11 #inc

SCOI 2014 省选总结

总的来说作为高一党,去做省选难度的题完全就是去玩的,还是找惯例起身跪hja. 跪毕,看看自己惨不忍睹的成绩,我只想说:电子坑大为什么day1的暴力只有10分!为什么呢?我笑看题面: 方伯伯种玉米,方伯伯玩扑克....特别是玩扑克,首先我就看不出来题到底在讲什么..其次有些同学试图去拿那10分的暴力,然后都算出来1809,就是离2700差了个十万八千里.所以,非常坑爹的题把我坑得内流满面..这告诉我们,刷题之.. SCOI 2014 省选总结,码迷,mamicode.com

HDU 5007 Post Robot

Post Robot Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1306    Accepted Submission(s): 941 Problem Description DT is a big fan of digital products. He writes posts about technological produc