字符串前缀和后缀匹配
2015-04-14 20:34
197 查看
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开始
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <stack> #include <queue> #include <set> #include <map> #include <iomanip> using namespace std; const int INF=0x5fffffff; const int MS=200005; const double EXP=1e-8; char str[MS]; int next[MS]; void get_next(char s[],int next[]) { int i,j; // i=1;j=0; i=0;j=-1; next[0]=-1; int len=strlen(s); while(i<len) { if(j==-1||s[i]==s[j]) { i++; j++; // if(s[i-1]==s[j-1]) // next[i]=next[j]; next[i]=j; // else // next[i]=j; } else j=next[j]; } } int count(int x) { if(x==0) return 0; return 1+count(next[x]); } int main() { int T; scanf("%d",&T); while(T--) { scanf("%s",str); int len=strlen(str); scanf("%s",str+len); len=strlen(str); get_next(str,next); printf("%d\n",count(len)); } return 0; }
相关文章推荐
- (字符串的模式匹配4.7.19——前缀数组suffix的应用)POJ 2752 Seek the Name, Seek the Fame(求解一个字符串中前缀和后缀一样的位置)
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- H - Seek the Name, Seek the Fame(KMP匹配前缀+后缀)
- HDOJ1671(字符串前缀匹配)
- 在字符串列表中找出与s最长前缀匹配的字符串
- Codeforces 536B Tavas and Malekas kmp找所有与前缀匹配的后缀
- 将数字转换为字符串、将字符串转换为数字,判断前缀,后缀
- 字符串相关处理kmp,前缀数,后缀树,后缀数组,最长回文串,最长重复字串,最长非重复字串
- HDU4300-Clairewd’s message(KMP前缀匹配后缀)
- 求所有前缀-后缀字符串相等的长度(kmp算法中的nxet数组)
- POJ - 2752 Seek the Name, Seek the Fame(KMP中对next数组的前缀后缀匹配应用)
- Java中 startsWith() 方法和endsWith()方法判断字符串的前缀和后缀
- 判断字符串是否有此前缀和后缀
- 字符串匹配的KMP算法(部分匹配表:前缀---后缀)
- 扩展KMP--求字符串S的所有后缀和字符串T的最长公共前缀
- 计蒜客 Barty's Computer hash求字符串前缀和后缀
- ACM水题--字符串的前缀和后缀
- POJ 1699 Best Sequence (TSP之dp状态压缩+KMP计算主串前缀匹配子串后缀)
- HDU 2594 Simpsons’ Hidden Talents(KMP求前缀后缀子串匹配)
- hdoj 1867 A + B for you again【kmp,前缀与后缀的匹配】