• 字符串前缀和后缀匹配


                          

    D - 娜娜梦游仙境系列——村民的怪癖

    Time Limit: 2000/1000MS (Java/Others)    Memory Limit: 128000/64000KB (Java/Others)

    Problem Description

    娜 娜费劲九牛二虎之力终于把糖果吃完了(说好的吃不完呢?骗人,口亨~),于是,缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤 纷,娜娜甚异之。复前行,欲穷其林。林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍 俨然,有良田美池桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。(摘自《桃花源记》)

    娜娜与村民交流了好久才发现这里的人们给孩子的命名方式很奇怪,首先村民们的名字都是用专门的符号来记录,正好是26个符号,于是娜娜就把它们替换 成‘a’~‘z’,然后首先把爸爸的名字作为孩子的姓,妈妈的名字作为孩子的名。这时候肯定有人会问,不是独生子女怎么办?很简单~取拼接好的名字的前缀 与后缀相同的部分从短到长依次作为孩子的姓名,啥,不够?那就不许你再生孩子!

    不过由于桃花村民与世隔绝太久了,以致于他们总是无法正确判断一对夫妻最多能生多少个孩子,于是就把这个任务交给你了。

    P.S. 若用S[1,n]表示一个长度为n的字符串,那么S[1,i](1<=i<=n)表示S的一个前缀,S[j,n](1<=j<=n)表示S的一个后缀。具体看样例解释

    Input

    多组数据,首先是一个正整数t(t<=20),表示数据的组数

    对于每一组数据,包含两个只由'a'~'z'组成的不含空格的字符串S1,S2,分别代表丈夫的姓名以及妻子的姓名。(1<=|S1|,|S2|<=100000)

    Output

    对于每组数据,输出一个整数,表示这对夫妻最多可以生育多少个孩子。

    Sample Input

    2
    ababc ababa
    aaaaa aaa

    Sample Output

    3
    8

    Hint

    对于样例1,把丈夫和妻子的姓名拼接在一起是ababcababa,可以作为孩子的姓名的是a、aba、ababcababa,故最多生育3个孩子

    对于样例2,把丈夫和妻子的姓名拼接在一起是aaaaaaaa,可以作为孩子的姓名的是a、aa、aaa、aaaa、aaaaa、aaaaaa、aaaaaaa、aaaaaaaa,故最多生育8个孩子

              注意next要从0开始

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <cmath>
     5 #include <algorithm>
     6 #include <string>
     7 #include <vector>
     8 #include <stack>
     9 #include <queue>
    10 #include <set>
    11 #include <map>
    12 #include <iomanip>
    13 using namespace std;
    14 const int INF=0x5fffffff;
    15 const int MS=200005;
    16 const double EXP=1e-8;
    17 
    18 char str[MS];
    19 int next[MS];
    20 
    21 void get_next(char s[],int next[])
    22 {
    23     int i,j;
    24    // i=1;j=0;
    25     i=0;j=-1;
    26     next[0]=-1;
    27    int len=strlen(s);
    28     while(i<len)
    29     {
    30        if(j==-1||s[i]==s[j])
    31        {
    32            i++;
    33            j++;
    34           // if(s[i-1]==s[j-1])
    35                // next[i]=next[j];
    36                next[i]=j;
    37          //   else
    38          //       next[i]=j;
    39        }
    40        else
    41             j=next[j];
    42     }
    43 }
    44 
    45 int count(int x)
    46 {
    47       if(x==0)
    48             return 0;
    49       return 1+count(next[x]);
    50 }
    51 
    52 int main()
    53 {
    54     int T;
    55     scanf("%d",&T);
    56     while(T--)
    57     {
    58             scanf("%s",str);
    59             int len=strlen(str);
    60             scanf("%s",str+len);
    61             len=strlen(str);
    62             get_next(str,next);
    63             printf("%d
    ",count(len));
    64     }
    65     return 0;
    66 }
  • 相关阅读:
    爆打团队 2016.04.12 站立会议
    爆打团队 2016.04.11 站立会议
    爆打团队 2016.04.10 站立会议
    爆打小组 4.3日站立会议
    随机生成题目的代码分析
    爆打 第二周第二次站立会议(2016.3.29)
    爆打小组,四则运算,算法实现
    add some template for ec-final
    2014_acmicpc_shanghai_google
    matrix_world_final_2013
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/4425987.html
Copyright © 2020-2023  润新知