2019 Multi-University Training Contest 5

String matching is a common type of problem in computer science. One string matching problem is as following:

Given a string s[0…len−1] , please calculate the length of the longest common prefix of s[i…len−1] and s[0…len−1] for each i>0 .

I believe everyone can do it by brute force.
The pseudo code of the brute force approach is as the following:
 

 



We are wondering, for any given string, what is the number of compare operations invoked if we use the above algorithm. Please tell us the answer before we attempt to run this algorithm.

 

 

Input

The first line contains an integer T , denoting the number of test cases.
Each test case contains one string in a line consisting of printable ASCII characters except space.

* 1≤T≤30

* string length ≤106 for every string

 

 

Output

For each test, print an integer in one line indicating the number of compare operations invoked if we run the algorithm in the statement against the input string.

 

 

Sample Input

 

3 _Happy_New_Year_ ywwyww zjczzzjczjczzzjc

 

 

Sample Output

 

17 7 32

 

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;  
char x[1000001];
long long Next[1000001],ex[1000001];
void getNext(char *str)
{
    int i=0,j,po,len=strlen(str);
    Next[0]=len;
    while(str[i]==str[i+1]&&i+1<len)
    i++;
    Next[1]=i;
    po=1;
    for(i=2;i<len;i++)
    {
        if(Next[i-po]+i<Next[po]+po)
            Next[i]=Next[i-po];
        else
        {
            j=Next[po]+po-i;
            if(j<0)j=0;
            while(i+j<len&&str[j]==str[j+i])
            j++;
            Next[i]=j;
            po=i;
        }
    }
}
void getkmp(char *s1,char *s2)
{
    int i=0,j,po,len=strlen(s1),l2=strlen(s2);
    getNext(s2);
    while(s1[i]==s2[i]&&i<l2&&i<len)
    i++;
    ex[0]=i;
    po=0;
    for(i=1; i<len; i++)
    {
        if(Next[i-po]+i<ex[po]+po)
        ex[i]=Next[i-po];
        else
        {
            j=ex[po]+po-i;
            if(j<0)j=0;
            while(i+j<len&&j<l2&&s1[j+i]==s2[j])
            j++;
            ex[i]=j;
            po=i;
        }
    }
}
int main()
{
    long long int i,t,n,s;
    scanf("%lld\n",&t);
    while(t--)
    {
        memset(ex,0,sizeof(ex));
        s=0;
        scanf("%s",x);
        n=strlen(x);
        getkmp(x,x);
        for( i=1;i<=n-1;i++)
        {
            if(ex[i]==0)
            s++;
            else
            s+=ex[i]+1;
            if(ex[i]+i>=n)
            s--;
        }
        printf("%lld\n",s);
    }

}

 

全部评论

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务