当前位置:网站首页>831. KMP string
831. KMP string
2022-07-07 19:59:00 【Hunter_ Kevin】
Given a pattern string S, And a template string P, All strings contain only uppercase and lowercase letters and Arabic numerals .
Template string P In mode string S Appears as a substring many times in .
Find the template string P In mode string S The starting subscript of all positions appearing in .
Input format
Enter the integer in the first line N, Representation string P The length of .
The second line of input string P.
In the third line, enter the integer M, Representation string S The length of .
On the fourth line, enter the string S.
Output format
All in one line , Output the starting subscript of all occurrences ( Subscript from 0 Start counting ), Integers are separated by spaces .
Data range
1≤N≤105
1≤M≤106
sample input :
3
aba
5
ababa
sample output :
0 2
/** The string subscript of the following code is from 1 Start **/
#include <iostream>
#include <cstring>
using namespace std;
const int N = 100010, M = 1000010;
char S[M], T[N];// Main string and mode string
int ne[N];// Pattern string next Array
int n, m;
/** Method 1 :brute-force The brute force algorithm Simple pattern matching algorithm */
int normalMatch(char* S, char* T, int pos)
{
int i = pos;
int j = 1;
while(i <= m && j <= n)
{
if(S[i] == T[j])// If the match ,i and j Move backward
i++,j++;
else
i = i-j+2, j = 1;// If it doesn't match ,i Go back to i The next position at the beginning ,j Go back to 1
}
if(j > n) return i - n;
return 0;
}
/** Method 2 : Calculate the of the pattern string next Array time , i Subscript for the current character , Just focus on the pattern string 1~i-1 The length of the equal maximum true pre suffix in the position is sufficient next[i] = The length of the maximum true pre suffix + 1; Be careful C++ It doesn't work inside char Storage int Type value ,char The storage range of is -128~127 Rewrite the Yan Weimin version 《 data structure 》kmp obtain next Array code , Easy to understand **/
void get_next(char* T)
{
int i, j;
ne[1] = 0;// At the first position of the pattern string next The value is 0, The tag can no longer be traced
for(i = 2; i <= n; i++)// Calculate from the second position next value
{
j = ne[i-1];// First of all, will j Set as i The previous position will be traced back to the position
while(j && T[i-1] != T[j])// When j You can go back to , also T[i-1] When comparing with characters that need to be traced back , If it doesn't match , be j Keep going back
j = ne[j];
ne[i] = j+1;//j When the mode string is i When the position does not match , Subscript that requires backtracking , Also just equal to the length of the maximum true pre suffix next[i] = The length of the maximum true pre suffix + 1;
}
}
/** Yan Weimin version 《 data structure 》kmp Matching process */
//S Main string T For the pattern string pos Subscript for starting query
int kmp(char* S, char* T, int pos)
{
int i, j;
i = pos;// Master string slave pos Start
j = 1;// Mode string slave 1 Start
while(i <= m && j <= n)
{
if(j == 0 || S[i] == T[j])// If j Back to 0 perhaps The character of the position to which the pattern string is traced And Main string current character matching , i and j Then move back
i++, j++;
else
j = ne[j];// If the pattern string is traced back to the position of the character And Main string current character Mismatch , be j Go back to next[j]
}
if(j > n)// After matching , If the match is successful , that j It will arrive T[0]+1 i It will also go to a position behind the completion of matching
return i - n;
return 0;
}
int main()
{
cin>> n >> T+1 >> m >> S+1;
// get_next(T);
//
// // The range of subject data is relatively strict , Will timeout
// for(int i = 1; i <= m; i++)
// {
// int tmp = kmp(S,T,i);
// if(tmp == 0)
// break;
// else
// i = tmp;
// cout<<tmp-1<<' ';
// }
/** Method 3 : Note that this method of calculation next The result of array and Yan Weimin version 《 data structure 》 obtain next The result of the array is different **/
/** obtain next Array ,i from 2 Start **/
ne[1] = 0; // Subscript to be 1 The character corresponding to next The array value is fixed to 0
int i, j;
for(i = 2, j = 0; i <= n; i++) // Traversing pattern strings , From the subscript for 2 Start calculating next value
{
while(j && T[i] != T[j+1]) // If j Not for 0 And will i Follow j+1 Match the characters of the position , Be able to match successful situations , Must be based on i Is the suffix at the end , Follow with j+1 Successfully matched the prefix at the end , This pre suffix must be the largest true pre suffix , Because the pre suffix is judged one by one from the beginning to the end of the string
j = ne[j]; // If i Follow j+1 The characters of the position do not match , be j Keep going back , Every time you go back , Just compare once i Follow j+1 Whether the characters of the position match
if(T[i] == T[j+1]) j++; // If j by 0 also At present i The character of the position does not match the first character , be j Always for 0; If i Follow j+1 Character matching of position , Then the length of the character before the suffix increases , That is, the subscript of the character indicated by the pattern string j Self increasing
ne[i] = j; // Will the current i Subscript that requires backtracking j Assign to the current next Array
}
/**kmp Matching process ,i from 1 Start **/
for(i = 1, j = 0; i <= m; i++)
{
while(j && S[i] != T[j+1])// When the main string i The position follows the pattern string j+1 When the position characters do not match , Pattern string j Keep going back , until j Go back to the subscript 0( The previous position of the first character ) perhaps Trace back to the position where the maximum prefix and suffix match exactly
j = ne[j];
if(S[i] == T[j+1]) j++; // If the main string i The position follows the pattern string j+1 Position matching , That is, when the maximum true pre suffix matches ,j Move a position back ,i It will also move back a position in the cycle , Then the next cycle continues to judge the next i Follow j+1 match
if(j == n) // Get to this point , Fixed time j+1 Follow i Position character matching , also j The last character of the pattern string has been reached
{
cout<<i-n<<' '; // Because the title is output subscript 0 Start , So it's output i- Mode string length
j = ne[j]; // When the primary main string and pattern string are matched ,i because for The loop must move to the next character that exactly matches the pattern string
//j It was originally in the last character of the pattern string , take j The assignment is ne[j], The purpose is to continue to judge in the next cycle With i-1 The next character of the string with the suffix at the end Follow or not With ne[j] Match the next character of the prefix at the end
}
}
return 0;
}
边栏推荐
- Mysql, sqlserver Oracle database connection mode
- Classification automatique des cellules de modules photovoltaïques par défaut dans les images de lecture électronique - notes de lecture de thèse
- Le PGR est - il utile au travail? Comment choisir une plate - forme fiable pour économiser le cœur et la main - d'œuvre lors de la préparation de l'examen!!!
- 歌单11111
- Automatic classification of defective photovoltaic module cells in electroluminescence images-論文閱讀筆記
- ASP.NET幼儿园连锁管理系统源码
- IP tools
- Ucloud is a basic cloud computing service provider
- L1-027 rental (Lua)
- Matplotlib drawing 3D graphics
猜你喜欢

PMP每日一练 | 考试不迷路-7.7

The project manager's "eight interview questions" is equal to a meeting

杰理之发起对耳配对、回连、开启可发现、可连接的轮循函数【篇】

Kirin Xin'an joins Ningxia commercial cipher Association

九章云极DataCanvas公司获评36氪「最受投资人关注的硬核科技企业」

ASP.NET幼儿园连锁管理系统源码
![[Verilog advanced challenge of Niuke network question brushing series] ~ multi bit MUX synchronizer](/img/7d/ed9a5c536b4cc1913fb69640afb98d.png)
[Verilog advanced challenge of Niuke network question brushing series] ~ multi bit MUX synchronizer

Kirin Xin'an won the bid for the new generation dispatching project of State Grid!

openEuler 资源利用率提升之道 01:概论

位运算介绍
随机推荐
网信办公布《数据出境安全评估办法》,9 月 1 日起施行
9 atomic operation class 18 Rohan enhancement
LeetCode_7_5
Throughput
开源OA开发平台:合同管理使用手册
Unable to link the remote redis server (solution 100%
最多可以参加的会议数目[贪心 + 优先队列]
IP tools
Matplotlib drawing 3D graphics
Training IX basic configuration of network services
torch.nn.functional.pad(input, pad, mode=‘constant‘, value=None)记录
[Verilog advanced challenge of Niuke network question brushing series] ~ multi bit MUX synchronizer
【Confluence】JVM内存调整
编译器优化那些事儿(4):归纳变量
mysql 的一些重要知识
我的创作纪念日
线性基
torch. nn. functional. Pad (input, pad, mode= 'constant', value=none) record
时间工具类
凌云出海记 | 赛盒&华为云:共助跨境电商行业可持续发展