-
题目描述:
-
给定两个字符串,求它们前后重叠的最长子串的长度,比如"abcde"和“cdefg”是"cde",长度为3。
-
输入:
-
输入可能包含多个测试案例。
对于每个测试案例只有一行, 包含两个字符串。字符串长度不超过1000000,仅包含字符'a'-'z'。
-
输出:
-
对应每个测试案例,输出它们前后重叠的最长子串的长度。
-
样例输入:
-
abcde cdefg
-
样例输出:
-
3
-
#include<stdio.h> #include<string.h> using namespace std; char vn[1000005], vm[1000005]; int vnlen, vmlen; bool match(int i) { int j = i; while(i<vnlen) { if (vn[i] != vm[i-j]) return false; i++; } return true; } int main() { while (~scanf("%s%s",vn, vm))//scanf死活不能AC { vnlen = strlen(vn); vmlen = strlen(vm); bool f = true; int i=vnlen>vmlen?vnlen-vmlen:0; for (; i < vnlen; i++) if (vn[i] == vm[0] && match(i)) { printf("%d\n", vnlen - i); f = false; break; } if (f) printf("0\n"); } return 0; } /************************************************************** Problem: 1535 User: 午夜小白龙 Language: C++ Result: Accepted Time:200 ms Memory:2972 kb ****************************************************************/
-
/
-
很简单,不细说了,不过有两个细节值得注意。
-
一是:前面字符串比后面字符串长时,不能交换顺序,比如abcfg 和abc重复子串就为0,abc和abcfg重复子串为3
-
二是:用scanf死活AC不了,改成~scanf就好了,我也不知道为什么啊
-
-