zoukankan      html  css  js  c++  java
  • 【KMP】Radio Transmission

    问题 L: 【KMP】Radio Transmission

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 34  解决: 7
    [提交] [状态] [讨论版] [命题人:admin]

    题目描述

    给你一个字符串,它是由某个字符串不断自我连接形成的。但是这个字符串是不确定的,现在只想知道它的最短长度是多少。

    输入

    第一行给出字符串的长度L,第二行给出一个字符串,全由小写字母组成。

    输出

    输出最短的长度。

    样例输入

    8
    cabcabca
    

    样例输出

    3
    

    提示

    我们可以利用abc不断自我连接得到abcabcabc,读入的cabcabca是它的子串。

    对于全部数据,1≤L≤106

    重点:  n - next[n]  是kmp中常用的操作 当最后一位失配时必然跳转到最小循环节处,所以答案就是 n - nxt[n] 了。  (结论转自https://blog.csdn.net/HouRui2000/article/details/77103790)

    举个栗子:c a b c a b c a  

     Next[]    -1 0 0 0 1 2 3 4  5

    n-next[n]   8-next[8] = 8-5 = 3 (最小循环节的长度)

    代码:

    #include <bits/stdc++.h>
     
    using namespace std;
     
    char p[1000005];
    int lenp;
    int Next[1000005];
    void get_next()
    {
        int i,j;
        Next[0] = j = -1;
     
        i = 0;
        while(i<lenp)
        {
            while(j!=-1&&p[j]!=p[i])
                j = Next[j];
            Next[++i] = ++j;
        }
    }
     
    int main()
    {
        int n;
        cin>>n;
     
        scanf("%s",p);
        lenp = strlen(p);
     
        get_next();
    //    for(int i=0;i<lenp;i++)
    //    {
    //        cout<<Next[i]<<" ";
    //    }
        cout<<n-Next[n];
        return 0;
    }
  • 相关阅读:
    sql server获取指定库下的所有表名
    sql根据字符将一行拆成多行
    刷题416. Partition Equal Subset Sum
    刷题394. Decode String
    刷题347. Top K Frequent Elements
    刷题309. Best Time to Buy and Sell Stock with Cooldown
    刷题338. Counting Bits
    刷题337. House Robber III
    刷题312. Burst Balloons
    刷题621. Task Scheduler
  • 原文地址:https://www.cnblogs.com/hao-tian/p/9647341.html
Copyright © 2011-2022 走看看