zoukankan      html  css  js  c++  java
  • HDU 1358字符串循环节问题 ,next数组

    求字符串循环节,要求每前i个字符串前缀是否循环,有的话打印出来。
    我对j=next[i]数组(未优化,从0开始,第一个为-1,)理解:字符s[i]的前面的字符串,最长的相同的前缀和后缀
    的长度,因此,i+1-next[i+1]刚好是最小循环单位(如果next[i+1]%(i+1-next[i+1)==0)(假设不是最小的,那么相同前后缀必然不是最大),

    而next[i+1]/(i+1-next[i+1])+1,是循环的个数(+1是加开头上那一段),

    -------------------i

    --------------

         ---------------i   

    next【i】从计算到s.size()(包括)。

    #include<iostream>
    #include<cstdio>
    #include<string>
    using namespace std;
    int next[1000001];
    void get_next(string s)    
    {
        next[0]=-1;             //第一个为-1
        int i=0;int j=-1;
        while(i<s.size())        
        {
            if(j==-1||s[i]==s[j])
            {
                i++;j++;
                next[i]=j;
            }
            else
               j=next[j];
        }
    }
    int main()
    {
        int n;string s;
        int tc=1;
        while(cin>>n&&n)
        {
            printf("Test case #%d
    ",tc);
            tc++;
            cin>>s;
            get_next(s);
            for(int i=1;i<n;i++)
            {
                if(next[i+1]>0&&next[i+1]%(i+1-next[i+1])==0)
                {
                    printf("%d %d
    ",i+1,next[i+1]/(i+1-next[i+1])+1);
                }
            }
            cout<<endl;
        }
    }
    


  • 相关阅读:
    NET 事件与委托
    NET高级 REF OUT
    缓冲池
    NET高级 EQUAL相等
    装箱拆箱
    CTS、CLS、CLR
    结构体及引用类型
    NET高级-深拷贝浅拷贝
    密闭类 静态 类及扩展方法
    NET高级-索引器
  • 原文地址:https://www.cnblogs.com/yezekun/p/3925724.html
Copyright © 2011-2022 走看看