日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu 1867 求两个串的和最小 ,KMP

發布時間:2025/6/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 1867 求两个串的和最小 ,KMP 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:
????? 給你兩個字符串,讓你求str1+str2,就是把1的后面和2的前面重疊的地方只顯示一遍就行了 abc + bcd = abcd,要求和的長度最小,和最小的前提下求字典序最小,還有就是兩個串可以交換位置的,cdab + abcd = abcdab 而不是 cdabcd,交換位置后合并是最短并且字典序最小的。

?

?

思路:
????? 首先得到兩個next數組,然后用str1 去匹配 str2,再用str2 去匹配str1,(因為可以交換),分別得到子串走到最后時匹配串的位置,x,y,這個位置也就是重合了多少個,如果x == y說明無論誰在前前面,匹配后的長度都是 l1 + l2 - x(或者 l1 + l2 - y ,x 和 y是相等的),這樣我們把字典序小的那個放在前面,另一個把前面的x個字母去掉后接到字典序小的那個串的后面。如果x != y,如果x > y 當然是按照大的那個匹配方式輸出了。因為要求的是和的長度最小。

?

#include<stdio.h>
#include<string.h>

#define N 100000 + 100

int next_a[N] ,next_b[N];
char str_a[N] ,str_b[N];

void get_next(char str[] ,int next[])
{
??? int j ,k ,m;
??? m = strlen(str);
??? j = 0 ,k = -1;
??? next[0] = -1;
??? while(j < m)
??? {
??????? if(k == -1 || str[j] == str[k])
??????? next[++j] = ++k;
??????? else
??????? k = next[k];
???? }
???? return;
}
???????
int KMP(char str1[] ,char str2[] ,int next[])
{
??? int n ,m ,i ,j;
??? n = strlen(str1);
??? m = strlen(str2);
??? for(i = j = 0 ;i < n ;)
??? {
??????? if(str1[i] == str2[j])
??????? {
?????????? i ++ ,j ++;
??????? }
??????? else
??????? {
??????????? j = next[j];
??????????? if(j == -1)
??????????? {
??????????????? j = 0;
??????????????? i ++;
??????????? }
??????? }
???? }
???? return j;
}

int main ()
{
??? while(~scanf("%s %s" ,str_a ,str_b))
??? {
??????? get_next(str_a ,next_a);
??????? get_next(str_b ,next_b);
??????? int x = KMP(str_a ,str_b ,next_b);
??????? int y = KMP(str_b ,str_a ,next_a);
??????? if(x == y)
??????? {
???????????? if(strcmp(str_a ,str_b) <= 0)
???????????? printf("%s%s\n" ,str_a ,str_b + x);
???????????? else
???????????? printf("%s%s\n" ,str_b ,str_a + x);
???????? }
???????? else
???????? {
???????????? if(x > y)
???????????? printf("%s%s\n" ,str_a ,str_b + x);
???????????? else
???????????? printf("%s%s\n" ,str_b ,str_a + y);
???????? }
??? }
??? return 0;
}
???????
????

總結

以上是生活随笔為你收集整理的hdu 1867 求两个串的和最小 ,KMP的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。