• pku 2406 && pku 1961 Period && hdu3746 Cyclic Nacklace


    嘿嘿,以前写的,刚刚突然看到的,就贴一下咯,KMP 的求next[]数组的活用,求最长重复字串

     pku2406

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     char str [1000010];
    int next[1000010];
     
    int getnext()
    {
     int i= 0, j= -1; next[0]= -1;
     
    while( str[i] )//这个过程其实就是在求next[]数组
     {
     if( j== -1 || str[i]== str[j] )
     {
     ++i,++j;
     next[i]= j;
     }
     else j= next[j];
     }
    int len= strlen(str);
     i= len- j;
    if( len% i== 0 ) return len/ i;
     else return 1;
    }
     int main()
    {
     while( gets( str), str[0]!= '.' )
     printf("%d\n", getnext() );
     
    return 0;
    }
    

     pku 1961

    #include<iostream>
    #include<string.h>
    using namespace std;
    char str[1000010];
    int net[1000010],len;
    void get_next()
    {
    	net[0]=-1;
    	int i=0,j=-1;
    	while(str[i])
    	{
    		if(j==-1 || str[i]==str[j])
    		{
    			i++;j++;
    			net[i]=j;
    		}
    		else j=net[j];
    	}
    }
    int main()
    {
    	int cas=0;
    	while(scanf("%d",&len)==1 && len)
    	{
    		scanf("%s",str);
    		printf("Test case #%d\n",++cas);
    		get_next();
    		for(int i=2;i<=len;i++)
    		{
    	    	int k=i-net[i];
    		    if(i%k==0 && i/k >=2)
    		    	printf("%d %d\n",i,i/k);
    		}
    		puts("");
    	}
    	return 0;
    }
    
    

     hdu 3746 Cyclic Nacklace

    View Code
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int N = 100000+10;
    char p[N];
    int nxt[N],m;
    void get_next()
    {
        nxt[0]=-1;
        int k=-1;
        for(int i=1;i<=m-1;i++)
        {
            while(k>-1 && p[k+1] !=p[i])
                k=nxt[k];
            if(p[k+1]==p[i])
                ++k;
            nxt[i]=k;
        }
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%s",p);
            m=strlen(p);
            get_next();
            int len=m-nxt[m-1]-1;
            if(len!=m && m%len==0)
                printf("0\n");
            else printf("%d\n",len-m%len);
        }
        return 0;
    }
  • 相关阅读:
    C语言,C++,static
    英语自我介绍
    总线接口与计算机通信(五)CAN总线
    总线接口与计算机通信(二)SPI总线
    总线接口与计算机通信(一)I2C总线
    总线接口与计算机通信
    C语言函数指针
    服务器体系(SMP, NUMA, MPP)与共享存储器架构(UMA和NUMA)
    实时调度类
    Linux CFS调度器之唤醒抢占--Linux进程的管理与调度(三十)
  • 原文地址:https://www.cnblogs.com/nanke/p/2238676.html
Copyright © 2020-2023  润新知