字符串前綴和后綴匹配


                      

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\n",count(len));
64     }
65     return 0;
66 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM