zoukankan      html  css  js  c++  java
  • poj 3773(KMP)

    KMP基础题,一开始思路没有理清楚导致写了好久。。。 悲催。

    要搞清楚题意,题目所围绕的是KMP算法中对自身串进行匹配的那一步

    假设有两个串 S,T , 我们要求的是S是否存在T中。

    其中我用的save[i],表示在i位置的后save[j]-1和S串的前save[i]-1个相等, 然后根据这个性质就可以解决

    String-Matching Automata
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 113   Accepted: 70

    Description

    The finite state automaton (FSA) is an important model of behavioral investigations in computer science, linguistics and many other areas. A FSA can be typically modeled as a string pattern recognizer described by a quintuple <Σ, S, s0, δ, 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. 
    δ is a function δ: S × Σ → 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 δ. To be specific, let s be the current state and w the symbol just read, the automaton moves to the state given by δ(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 automaton is built) is therefore Θ(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 illustrates how the automaton works given an input string “abababacaba”. 



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

    Input

    Several 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’.

    Output

    For each pattern, output should contain (m + 1) lines(m is the length of the pattern). The nth line describes how the automaton changes its state from staten-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 staten-1, it will transit to state p1 after reading a character ‘a’. The 2nd state number p2 indicates that when the automaton is in staten-1, it will transit to state p2 after reading a character ‘b’… And so on.

    Sample Input

    ababaca
    0

    Sample Output

    0 1 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
    1 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
    2 3 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
    3 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    4 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
    5 1 4 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    6 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 0
    7 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

    Source

     
     
    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    using namespace std;
    
    
    char g[10010];
    int ans[10010][30];
    int save[10010];
    
    int main()
    {
        while(scanf("%s",g)&&g[0]!='0')
        {
            int len=strlen(g);
            memset(ans,0,sizeof(ans));
            memset(save,0,sizeof(save));
            ans[0][g[0]-'a']=1;
            int j=0;
            int cnt=1;
            for(int i=1;i<=len;i++,cnt++)
            {
                if(i != len)
                    ans[cnt][ g[i]-'a' ]=(i+1);
                ans[cnt][ g[0]-'a' ]=max(1,ans[cnt][ g[0]-'a' ]);
                
                int tj=i-1;
                while(1)
                {
                    if(tj<=0) break;
                    ans[cnt][ g[ save[tj] ] -'a' ]=max(ans[cnt][ g[ save[tj] ] -'a' ],save[tj]+1);
                    tj = save[tj]-1;
                }
                if(i==len) break;
                /////////////////////////////    
                while(g[i]!=g[j]&&j!=0)
                {
                    j=save[j-1];
                }
                if(g[i]==g[j])
                {
                    j++;
                }
                save[i]=j;
                //////////////
            }
            for(int i=0;i<=len;i++)
            {
                printf("%d",i);
                for(int j=0;j<26;j++)
                    printf(" %d",ans[i][j]);
                printf("\n");
            }
        }
        return 0;
    }
  • 相关阅读:
    Ext.Net学习笔记02:Ext.Net用法概览
    Ext.Net学习笔记01:在ASP.NET WebForm中使用Ext.Net
    【转】好的用户界面-界面设计的一些技巧
    发布mvc报错:403.14-Forbidden Web 服务器被配置为不列出此目录的内容
    抢票季:吐槽12306 & 分享抢票经验
    2.5星|《解谜茑屋》:疑似企业公关稿,对话体,信息含量较低
    樊登推荐过的书15本,好书2本半
    一些黑猩猩会使用草药治病,疗效还不错:3.5星|邓巴《人类的算法》
    莫奈塞尚的知名度,主要归功于富豪画家卡耶博特的遗赠:4星|《引爆流行》
    4星|《猎药师》:五千年以来药物研发简史,作者是前一线科学家
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/3089805.html
Copyright © 2011-2022 走看看