学密码学一定得学程序 分类: 串 2015-06-18 16:58 22人阅读 评论(0) 收藏

学密码学一定得学程序

TimeLimit: 1000ms Memory limit: 65536K 有疑问?点这里^_^

题目描述


曾经,ZYJ同学非常喜欢密码学。有一天,他发现了一个很长很长的字符串S1。他很好奇那代表着什么,于是神奇的WL给了他另一个字符串S2。但是很不幸的是,WL忘记跟他说是什么意思了。这个时候,ZYJ不得不求助与伟大的ZPZP笑了笑说,这个很神奇的,WL的意思是只要你找到她给你的字符串在那个神奇的字符串的位置,你就会有神奇的发现。ZYJ恍然大悟,原来如此,但是悲剧来了,他竟然不知道怎么找。。。。是的,很囧是不是。所以这时候就需要化身为超级玛丽亚的你现身了,告诉他吧。。。。。。

输入


首先输入一个n。表示有n组测试数据。


每组测试数据有两行。


第一行为字符串S1,长度不大于1000000


第二行为字符串S2,长度不大于10000,并且长度不小于2

输出


输出S2S1的位置。如果有多个位置,只输出第一个位置。


如果找不到,就输出“::>_<::“(不输出双引号)。

示例输入


1

ASDFGDF

DF

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <time.h>
#include <cctype>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <climits>
#include <string>
#include <iostream>
#include <algorithm>
#define RR freopen("input.txt","r",stdin)
#define WW freopen("output.txt","w",stdout)
#define INF 0x3f3f3f3f

using namespace std;

const int Max=1001000;

int next[Max];
char s[Max];
char c[Max];
void KMP_next()//next数组
{
    int len=strlen(c);
    int i=0,j=-1;
    next[0]=-1;
    while(i<len-1)
    {
        if(j==-1||c[i]==c[j])
        {
            ++i;
            ++j;
            if(c[i]!=c[j])
            {
                next[i]=j;
            }
            else
            {
                next[i]=next[j];
            }
        }
        else
        {
            j=next[j];
        }
    }
}
void KMP()//kmp匹配
{
    int len1=strlen(s);
    int len2=strlen(c);
    int i=0,j=0;
    while(i<len1&&j<len2)
    {
        if(j==-1||s[i]==c[j])
        {
            ++i;
            ++j;
        }
        else
        {
            j=next[j];
        }
    }
    if(j==len2)
    {
        printf("%d
",i-len2+1);
    }
    else
    {
        printf("::>_<::
");
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s %s",s,c);
        KMP_next();
        KMP();
    }

    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/juechen/p/4722021.html