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

      

    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    [opencv] 生成标定棋盘格
    [opencv] cmake编译opencv并去窗口边框
    [opencv] matlab生成opencv可读的xml
    [matlab] vc++和matlab混合编程
    全息摄影
    [opencv&opengl]多窗口显示
    CPLEX
    ios读取设备姿态并传输
    python: 基本知识记录
    css: position的使用;
  • 原文地址:https://www.cnblogs.com/caijiaming/p/9097192.html
Copyright © 2020-2023  润新知