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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符串匹配自动机

發(fā)布時(shí)間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符串匹配自动机 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在長度為n的數(shù)組T[n]中查找一個(gè)長度為m的數(shù)組P[m],如果用樸素字符串匹配方法要用O(mn)的時(shí)間,用自動(dòng)機(jī)匹配要O(n)的時(shí)間,但一般的自動(dòng)機(jī)要O(ml)的時(shí)間(l為字符集的寬度),而KMP只要O(m)的預(yù)處理時(shí)間。

其實(shí)最早接觸字符串匹配自動(dòng)機(jī)應(yīng)該是在數(shù)字電路中的序列檢測器那時(shí)候,序列檢測器是用硬件區(qū)實(shí)現(xiàn)一個(gè)個(gè)狀態(tài)的轉(zhuǎn)換,這里和那兒是一個(gè)原理主程序維持一個(gè)狀態(tài)量mode是在讀入某個(gè)字符后的匹配長度,它隨著繼續(xù)讀入字符而不斷變化,而變化的函數(shù)可以由模式P[m]和字符集去確定,確定這個(gè)函數(shù)的時(shí)間可以為O(ml)(根據(jù)《算法導(dǎo)論》,但是我的程序都是O(m^3 * l)的,不知道他是怎么實(shí)現(xiàn)的),以杭電1686題為例:

1 #include<stdio.h> 2 #include<string.h> 3 #include<memory.h> 4 5 #define MAXM 1000005 6 #define MAXN 10005 7 #define MAXW 26 8 9 char str[MAXM]; 10 char key[MAXN]; 11 int mode[MAXN][MAXW]; 12 13 int FINITE_AUTOMATION_MATCHER(); 14 void COMPUTE_TRANSITION_FUNCTION(); 15 16 int main() 17 { 18 //freopen("Sample Input.txt","r",stdin); 19 int T; 20 scanf("%d",&T); 21 22 while(T--) 23 { 24 scanf("%s%s",key,str); 25 printf("%d\n",FINITE_AUTOMATION_MATCHER()); 26 } 27 28 return 0; 29 } 30 31 int FINITE_AUTOMATION_MATCHER() 32 { 33 int len1 = strlen(str); 34 int len2 = strlen(key); 35 int cnt = 0; 36 int cur_mode = 0; 37 38 memset(mode,0,sizeof(mode)); 39 COMPUTE_TRANSITION_FUNCTION(); 40 41 for(int i = 0;i < len1;i++) 42 { 43 cur_mode = mode[cur_mode][str[i] - 'A']; 44 cnt = cur_mode == len2 ? cnt + 1 : cnt; 45 } 46 47 return cnt; 48 } 49 50 51 void COMPUTE_TRANSITION_FUNCTION() //四層循環(huán)求轉(zhuǎn)換函數(shù),O(m^3 * l)的復(fù)雜度 52 { 53 int len = strlen(key); 54 55 for(int i = 0;i <= len;i++) 56 { 57 for(int j = 0;j < 26;j++) //寫的有點(diǎn)倉促,很亂。。。。 58 { 59 int k = i + 1 > len ? len : i + 1; 60 int flag = 0; 61 62 for(;k > 0;k--) 63 { 64 flag = 1; 65 66 if(key[k - 1] - 'A' != j) 67 { 68 continue; 69 } 70 71 for(int s = 0;s < k - 1 && flag;s++) 72 { 73 flag = key[s] == key[i - k + s + 1] ? 1 : 0; 74 } 75 76 if(flag) 77 { 78 break; 79 } 80 } 81 mode[i][j] = k; 82 } 83 } 84 } 85 86 87 88 89 90 普通的自動(dòng)機(jī)由于轉(zhuǎn)移函數(shù)耗時(shí)太長TL了。KMP算法類似于自動(dòng)機(jī)它也維持一個(gè)暫時(shí)的匹配長度mode,在讀入下一個(gè)字符時(shí)如果匹配不成功,那么就要減小mode,求減小的量(前綴函數(shù))就是KMP的核心。前綴函數(shù)f[i]是滿足是模式P[i]的真后綴和前綴的最大長度,算法中求前綴函數(shù)的過程就是模式自己和自己匹配的過程,f[i]就是在讀入第i個(gè)字符時(shí)和模式P的最大匹配長度,因此求前綴函數(shù)的過程和匹配過程高度相似,下面還是以hdu1686題為例: 91 92 #include<stdio.h> 93 #include<string.h> 94 #include<memory.h> 95 96 #define MAXM 1000005 97 #define MAXN 10005 98 99 char str[MAXM]; 100 char key[MAXN]; 101 int mode[MAXN]; 102 103 int KMP_MATCHER(); 104 void COMPUTE_PREFIX_FUNCTION(); 105 106 int main() 107 { 108 //freopen("Sample Input.txt","r",stdin); 109 int T; 110 scanf("%d",&T); 111 112 while(T--) 113 { 114 scanf("%s%s",key,str); 115 printf("%d\n",KMP_MATCHER()); 116 } 117 118 return 0; 119 } 120 121 int KMP_MATCHER() 122 { 123 int cnt = 0; 124 int cur_mode = 0; //相當(dāng)于自動(dòng)機(jī)中的狀態(tài) 125 int len1 = strlen(str); 126 int len2 = strlen(key); 127 128 memset(mode,0,sizeof(mode)); 129 COMPUTE_PREFIX_FUNCTION(); 130 131 for(int i = 0;i < len1;i++) 132 { 133 while(cur_mode > 0 && key[cur_mode] != str[i]) 134 { 135 cur_mode = mode[cur_mode]; 136 } 137 138 if(key[cur_mode] == str[i]) 139 { 140 cur_mode++; 141 } 142 143 if(cur_mode == len2) 144 { 145 cnt++; 146 } 147 } 148 149 return cnt; 150 } 151 152 void COMPUTE_PREFIX_FUNCTION() //自己和自己匹配的過程 153 { 154 mode[1] = 0; 155 156 int k = 0; //已匹配長度 157 158 for(int i = 2;i <= strlen(key);i++) 159 { 160 while(k > 0 && key[k] != key[i - 1]) 161 { 162 k = mode[k]; 163 } 164 165 if(key[k] == key[i - 1]) 166 { 167 k++; 168 } 169 170 mode[i] = k; 171 } 172 } 173 174 //7738004 2013-03-11 19:14:48 Accepted 1686 671MS 1268K 1152 B G++ 超級旅行者

?

算法還是不夠快,功力尚淺啊,還需修煉,看看有沒有更快的算法。


參考文獻(xiàn):《算法導(dǎo)論》


?

轉(zhuǎn)載于:https://www.cnblogs.com/codingMozart/archive/2013/03/11/6439749.html

總結(jié)

以上是生活随笔為你收集整理的字符串匹配自动机的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 91伊人久久 | 日韩一区二区三区四区五区六区 | 丁香午夜 | 天堂精品一区 | 人人揉人人 | 国产白浆在线 | 国产l精品国产亚洲区久久 午夜青青草 | 天天插视频| 青青操精品 | 亚洲精品国偷拍自产在线观看蜜桃 | 爱福利视频广场 | 丁香花高清视频完整电影 | 草在线视频 | 免费毛片观看 | 国产福利视频在线 | 日本不卡在线播放 | 男女一起插插插 | 亚洲色妞 | 一区二区三区视频在线观看免费 | 韩日午夜在线资源一区二区 | 99精品国产99久久久久久97 | 国产二区视频 | 中文字幕在线观看三区 | 久久久久免费精品视频 | 日本一区二区视频在线 | 亚洲乱码国产乱码精品 | 欧美久久久久久又粗又大 | 一区二区韩国 | 青青草国产在线视频 | 欧美亚洲激情视频 | 北京少妇xxxx做受 | 95视频在线| 国产男女猛烈无遮挡免费视频动漫 | 潘金莲裸体一级淫片视频 | 国产精伦| 日日撸夜夜撸 | 国产女女调教女同 | 好色先生视频污 | www.夜色 | 国产性生活毛片 | 999视频| 韩国无码av片在线观看网站 | 午夜国产一区 | 探花国产 | 国产精品久久一区二区三区动 | 四虎av在线| 日韩天堂网 | 午夜噜噜| 哺乳期喷奶水丰满少妇 | 国产精九九网站漫画 | 午夜生活片 | 美国黄色一级大片 | 人妻熟人中文字幕一区二区 | 免费黄色小视频网站 | 成人av小说 | 好姑娘在线观看高清完整版电影 | 一级艳片新婚之夜 | 国产精品久久久久三级 | 亚洲另类图区 | 四虎国产视频 | 午夜做爰xxxⅹ性高湖视频美国 | 超碰在线图片 | 中文字幕色哟哟 | 午夜久久 | 中文字幕中出 | 狠狠操亚洲| 日日摸夜夜添狠狠添欧美 | 麻豆传媒网 | 欧美做受视频 | 91亚洲国产成人精品一区二区三 | 91成人看片 | 亚洲琪琪| 91成人亚洲 | 亚洲图片激情小说 | 催眠调教艳妇成肉便小说 | 欧美成人aaaaⅴ片在线看 | 国产亚洲精品久久久久久无几年桃 | 国产91精品欧美 | 嫩草国产在线 | 欧美成人亚洲 | www.性欧美 | 我们的生活第五季在线观看免费 | www夜夜| 久久久久性 | 男性影院 | 免费人成在线观看 | 人妻无码久久精品人妻 | 成人久久精品人妻一区二区三区 | 中文字幕一区二区久久人妻网站 | 欧美日韩一区二区综合 | 亚洲精品久久久久久久久久久 | 精品在线播放 | 91黄色大片 | 欧美国产中文 | 一区二区三区国产精品视频 | 91亚洲精品久久久蜜桃网站 | 欧美精品一级 | 精品人妻一区二区三区蜜桃视频 | 日韩天天|