zoukankan      html  css  js  c++  java
  • kmp

    https://vjudge.net/contest/227956#problem/A

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    int next[10000050];
    char s[10000050];
    void cal_next(int len,char a[])
    {
    	next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
    	int j=-1;//k初始化为-1
    	for(int i=1;i<len;i++)
    	{
    		while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
    		{
    			j=next[j];//往前回溯
    		}
    		if(a[i]==a[j+1])//如果相同,j++
    		j=j+1;
    		next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
    	 } 
    }
    int main()
    {
    	while(scanf("%s",s)&&s[0]!='.')
    	{
    		getchar();
    		int len=strlen(s);
    		//int ans=1;
    		cal_next(len,s);
    	//	for(int i=0;i<len;i++)
    	  //  printf("%d ",next[i]);
    		if(len%(len-next[len-1]-1)==0)
    		printf("%d
    ",len/(len-next[len-1]-1));
    		else
    		printf("1
    ");
    	}
    	return 0;
    }
    

      

    https://vjudge.net/contest/227956#problem/B

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    int next[10000050];
    char s[10000050];
    void cal_next(int len,char a[])
    {
    	next[0]=-1;//next[0]初始化为-1,-1表示不存在相同的最大前缀和最大后缀
    	int j=-1;//k初始化为-1
    	for(int i=1;i<len;i++)
    	{
    		while(j>-1&&a[i]!=a[j+1])//如果下一个不同,那么j就变成next[j],注意next[j]是小于j的
    		{
    			j=next[j];//往前回溯
    		}
    		if(a[i]==a[j+1])//如果相同,j++
    		j=j+1;
    		next[i]=j;//这个是把算的j的值(就是相同的最大前缀和最大后缀长)赋给next[q]
    	 } 
    }
    int main()
    {
    	while(scanf("%s",s)&&s[0]!='.')
    	{
    		getchar();
    		int len=strlen(s);
    		//int ans=1;
    		cal_next(len,s);
    	//	for(int i=0;i<len;i++)
    	  //  printf("%d ",next[i]);
    		if(len%(len-next[len-1]-1)==0)
    		printf("%d
    ",len/(len-next[len-1]-1));
    		else
    		printf("1
    ");
    	}
    	return 0;
    }
    

      

    https://vjudge.net/contest/227956#problem/E

    #include<iostream>
    #include<stdio.h>
    #include<cstring>
    using namespace std;
    char s[1000050],p[10050];
    int next[10050];
    void cal_next(char a[],int len)
    {
    	next[0]=-1;
    	int k=-1;
    	for(int i=1;i<len;i++)
    	{
    		while(k>-1&&a[i]!=a[k+1])
    		k=next[k];
    		if(a[i]==a[k+1])
    		k++;
    		next[i]=k;
    	}
    }
    int kmp(char a[],int len1,char b[],int len2)
    {
    	int k=-1,ans=0;
    	for(int i=0;i<len1;i++)
    	{
    		while(k>-1&&a[i]!=b[k+1])
    		k=next[k];
    		if(a[i]==b[k+1])
    		k++;
    		if(k==len2-1)
    		{
    			ans++;
    			k=next[k];
    		}
    	}
    	return ans;
    }
    int main()
    {
    	int t;
    	scanf("%d",&t);
    	getchar();
    	while(t--)
    	{
    		int ans=0;
    		scanf("%s",p);
    		getchar();
    		scanf("%s",s);
    		getchar();
    		int len1=strlen(p);
    		int len2=strlen(s);
    		cal_next(p,len1);
    		ans=kmp(s,len2,p,len1);
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    

      

    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    2014 年最热门的国人开发开源软件TOP 100
    欢迎访问李培冠博客
    Go语言学习之路(持续更新)
    租房项目 获取地区信息服务
    租房项目 启动前的处理
    一步步带你用 FastDFS 搭建文件管理系统 详细的不得鸟
    golang 两个go程轮流打印一个切片
    golang 拷贝大切片一定比小切片代价大吗
    matlab 如何把数组A中与数组B中元素相同的元素删除
    golang 如何翻转含有中文 数字 英文字母等任意字符串
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9097192.html
Copyright © 2011-2022 走看看