HDU-3407-string-matching Automata

Source: Internet
Author: User

Start with the question:

String-matching Automata

Time Limit: 2000/1000 MS (Java/others) memory limit: 32768/32768 K (Java/Others)
Total submission (s): 215 accepted submission (s): 140


Problem descriptionthe finite state automaton (FSA) is an important model of behavioral investigations in computer science, linguistics and other areas. a fsa can be typically modeled as a string pattern recognizer described by a quintuple <Σ, S, S0, Delta, F>, where:

Σ is the input alphabet (a finite nonempty set of symbols ).
S is a finite nonempty set of States.
S0 is an element in S designated as the initial state.
Delta is a function delta: S x Σ → S known as the transition function.
F is a (possibly empty) subset of s whose elements are designated as the final states.

An FSA with the above description operates as follows:

At the beginning, the automaton starts in the initial state s0.
The automaton continuously reads symbols from its input, one symbol at a time, and transits between States according to the transition function delta. to be specific, let s be the current state and W the symbol just read, the automation on moves to the state given by Delta (S, W ).
When the automaton reaches the end of the input, if the current state belongs to F, the string consisting sequentially of the symbols read by the automaton is declared accepted, otherwise it is declared rejected.

Just as the name implies, a string-matching automaton is a FSA that is used for string matching and is very efficient: they examine each character exactly once, taking constant time per text character. the matching time used (after the automation is built) is therefore seconds (n ). however, the time to build the automaton can be large.

Precisely, there is a string-matching Automaton for every pattern P That you search for in a given text string T. for a given pattern of length m, the corresponding automaton has (m + 1) States {q0, Q1 ,..., QM}: q0 is the start state, Qm is the only final state, and for each I in {0, 1 ,..., M}, if the automaton reaches State Qi, it means the length of the longest prefix of P that is also a suffix of the input string is I. when we reaches state Qm, it means P is a suffix of the currently input string, which suggest we find an occurrence of P.

The following graph shows a string-matching Automaton for the pattern "ababaca", and how the automaton works given an input string "ababacaba ".



Apparently, the matching process using string-matching automata is quite simple (also efficient). However, building the automation on efficiently seems to be tough, and that's your task in this problem.

 

Inputseveral lines, each line has one pattern consist of only lowercase alphabetic characters. The length of the longest pattern is 10000. The input ends with a separate line of '0 '.

 

Outputfor each pattern, output shoshould contain (m + 1) lines (M is the length of the pattern ). the Nth line describes how the automaton changes its State from state (n-1) after reading a character. it starts with the State number (n-1), and then 26 State numbers follow. the 1st State number P1 indicates that when the automaton is in state (n-1), it will transit to state P1 after reading a character 'A'. The 2nd State number P2 indicates that when the automaton is in state (n-1), it will transit to state P2 after reading a character 'B '... And so on.

 

Sample inputabaca0

 

Sample output0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 01 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 02 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 05 1 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 06 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 07 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 source2010 national programming Invitational contest host by zstu question: Give You A string, when you match a certain position, if the matched letter is 'A'-'Z', where are the locations to be transferred separately? You can use KMP + to perform other operations. Another method is to directly write an AC automatic machine, after the automatic mechanism is built, the words entered along the trie tree print the next [I] ['A' ~ of the node directly to a node '~ 'Z. Code:
 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 #define MAX 10002 5 using namespace std; 6  7 struct Trie{ 8     int next[MAX][26],fail[MAX],end[MAX],num[MAX][26]; 9     int root,L;10 11     int newnode(){12         for(int i=0;i<26;i++){ next[L][i]=-1; num[L][i]=0;}13         end[L++]=0;14         return L-1;15     }16     void init(){17         L=0;    root=newnode();18     }19 20     void insert(char buf[]){21         int len=strlen(buf);22         int now = root;23         for(int i=0;i<len;i++){24             if(next[now][buf[i]-‘a‘]==-1){25                 next[now][buf[i]-‘a‘]=newnode();26 27             }28             now=next[now][buf[i]-‘a‘];29         }30         end[now]++;31     }32 33     void build(){34         queue<int> Q;35         fail[root]=root;36         for(int i=0;i<26;i++){37             if(next[root][i]==-1) next[root][i]=root;38             else{39                 fail[next[root][i]]=root;40                 Q.push(next[root][i]);41             }42         }43         while(!Q.empty()){44             int now=Q.front();45             Q.pop();46             for(int i=0;i<26;i++){47                 if(next[now][i]==-1) next[now][i]=next[fail[now]][i];48                 else{49                     fail[next[now][i]]=next[fail[now]][i];50                     Q.push(next[now][i]);51                 }52             }53         }54     }55 56     void print(char buf[]){57         int len=strlen(buf);58         int now=root;59         for(int i=0;i<=len;i++){60             printf("%d",i);61             for(int j=0;j<26;j++) printf(" %d",next[now][j]);62             printf("\n");63             now=next[now][buf[i]-‘a‘];64         }65     }66 };67 68 Trie ac;69 char s[MAX];70 71 int main()72 {73     //freopen("data.txt","r",stdin);74     while(scanf("%s",s),strcmp(s,"0")){75         ac.init();76         ac.insert(s);77         ac.build();78         ac.print(s);//printf("\n");79     }80     return 0;81 }
/X 3407 */

 

 

HDU-3407-string-matching Automata

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.