• 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;
    }
    

      

    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    MongoDB学习笔记(五) MongoDB文件存取操作(转)
    MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系(转)
    Log4net配置相关
    UML 依赖 关联 聚合 组合
    亲属称谓
    Unity预定义程序集及自定义包编译顺序
    For Windows Phone8 phones make sure that the Windows Phone IP Over USB Transport(IpOverUsbSvc) service is running
    提升Entityframework效率的几种方法
    将RDLC报表工具栏中的英文改为中文
    C#函数式程序设计初探——基础理论篇
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9097192.html
Copyright © 2020-2023  润新知