#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[2000005],b[2000005]; int nextd[2000010]; void get(char *ch) { int l = strlen(ch); int s = 0,t = -1; nextd[0] = -1; while(s <l) { if(t == -1|| ch[s] == ch[t]) { t++; nextd[++s] = t; } else t = nextd[t]; } } int kmpd(char *ch1,char *ch2) { get(ch2); int l1 = strlen(ch1); int l2 = strlen(ch2); int s = 0,t = 0; int ma=0; while(s <l1&&t<l2) { if(t == -1 || ch1[s] == ch2[t]) { t++; s++; } else t = nextd[t]; } return t; } int main() { int i,j,k,n,m,l; while(~scanf("%d",&n)) { while(n--) { scanf("%s %s",a, b); int la = strlen(a); int lb = strlen(b); int l1 = kmpd(a, b); int l2 = kmpd(b, a); //printf("%d %d\n",l1,l2); printf("%d\n",la + lb - max(l1,l2)); } } return 0; }
HDU 1841: Find the Shortest Common Superstring
最新推荐文章于 2017-08-15 11:42:23 发布