首页 > 代码库 > Problem F: 小金廷的逆袭

Problem F: 小金廷的逆袭

分析:这道题主要是考我们关于KMP算法的应用的!题目要求求出两个字符串中最长的连续字符的个数!由于题目的上限很大,所以暴力搜索的话肯定是会超时的!


题解:这个,选第一个字符串为目标,使用两个for循环来依次枚举所选的这个字符串的子字符串,然后求出该字符串的next[]数组,然后使用kmp算法,和第二个字符串对比匹配,由于题目要求的是连续的最长的子字符串,所以在枚举时一旦发现不能匹配上,就直接跳出内循环,然后再从外循环重新开始枚举并搜索!


代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    int n,m,num;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        while(m--)
        {
            getchar();
            char a[20];
            scanf("%s",a);
            if(!strcmp(a,">>"))
            {
                scanf("%d",&num);
                n=n>>num;
                printf("%d\n",n);
            }
            if(!strcmp(a,"<<"))
            {
                scanf("%d",&num);
                n=n<<num;
                printf("%d\n",n);
            }
            if(!strcmp(a,"~"))
            {
                n=(~n);
                printf("%d\n",n);
            }
            if(!strcmp(a,"|"))
            {
                scanf("%d",&num);
                n=(n|num);
                printf("%d\n",n);
            }
            if(!strcmp(a,"&"))
            {
                scanf("%d",&num);
                n=(n&num);
                printf("%d\n",n);
            }
            if(!strcmp(a,"^"))
            {
                scanf("%d",&num);
                n=(n^num);
                printf("%d\n",n);
            }
        }
    }
    return 0;
}


Description

        小金廷酷爱数学,立志成为数学大神的他,最近想出了一个奇怪的东西-数字相似度。他相信数字之间必然存在着某种联系(或许像DNA一样),他定义数字之间的相似度为其最长的连续相同数字的长度。现在为了寻得更多的相似度,以便他更好的分析其中所存在的联系,他想请你帮他计算出一些相似度。

Input

      输入包含多组测试数据。

      每组测试数据包含1行,包含2个数n,m ( 0 < = m,n < = 10^1000 )

Output

        输出仅包含一行,代表数字间的相似度。

Sample Input

100 1002333 2333321312048 14096

Sample Output

341

Problem F: 小金廷的逆袭