problemscpp
A collection of my answers to algorithm problems in c++.
函数
acwing::acwing831 命名空间参考

  1. KMP字符串
更多...

函数

vector< int > get_next (const string &str)
 
int main (istream &cin, ostream &cout)
 
 TEST (acwing831, case1)
 
 TEST (acwing831, case2)
 
 TEST (acwing831, case3)
 
 TEST (get_next, case1)
 
 TEST (get_next, case2)
 
 TEST (get_next, case3)
 

详细描述

  1. KMP字符串

函数说明

◆ get_next()

vector< int > acwing::acwing831::get_next ( const string &  str)

在文件 acwing.cpp6821 行定义.

6821 {
6822 const int n = str.length();
6823 vector next(n, 0);
6824 int i = 1;
6825 int j = 0;
6826 while(i < n && j < n) {
6827 if(str[i] == str[j]) {
6828 //匹配成功
6829 next[i] = j + 1;
6830 j++;
6831 i++;
6832 } else {
6833 if(j == 0) {
6834 //开头就匹配失败
6835 i++;
6836 } else {
6837 //匹配失败,但不在开头
6838 j = next[j - 1];
6839 }
6840 }
6841 }
6842 return next;
6843 }

被这些函数引用 main() , 以及 TEST().

◆ main()

int acwing::acwing831::main ( istream &  cin,
ostream &  cout 
)

在文件 acwing.cpp6788 行定义.

6788 {
6789 int n;
6790 int m;
6791 string p;
6792 string s;
6793 cin >> n >> p >> m >> s;
6794 const vector<int> next = get_next(p);
6795 int ip = 0;
6796 int is = 0;
6797 while(ip < n && is < m) {
6798 if(p[ip] == s[is]) {
6799 if(ip == n - 1) {
6800 //整串匹配成功
6801 cout << is - n + 1 << ' ';
6802 ip = next[ip - 1];
6803 } else {
6804 //当前匹配成功
6805 ip++;
6806 is++;
6807 }
6808 } else {
6809 if(ip == 0) {
6810 //开头就匹配失败
6811 is++;
6812 } else {
6813 //匹配失败,但不在开头
6814 ip = next[ip - 1];
6815 }
6816 }
6817 }
6818 return 0;
6819 }
vector< int > get_next(const string &str)
Definition: acwing.cpp:6821

引用了 get_next().

被这些函数引用 TEST().

◆ TEST() [1/6]

acwing::acwing831::TEST ( acwing831  ,
case1   
)

在文件 acwing_test.cpp3136 行定义.

3136 {
3137 istringstream in("3\n"
3138 "aba\n"
3139 "5\n"
3140 "ababa");
3141 auto out = ostringstream();
3142 main(in, out);
3143 const auto ans = out.str();
3144 ASSERT_EQ("0 2 ", ans);
3145 }
int main(int argc, char **argv)
Definition: main.cpp:5

引用了 main().

◆ TEST() [2/6]

acwing::acwing831::TEST ( acwing831  ,
case2   
)

在文件 acwing_test.cpp3147 行定义.

3147 {
3148 istringstream in("10\n"
3149 "jNNNNjNNNN\n"
3150 "30\n"
3151 "jNNPw9NNNNnNMANTNHGNjNNNNjNNNN");
3152 auto out = ostringstream();
3153 main(in, out);
3154 const auto ans = out.str();
3155 ASSERT_EQ("20 ", ans);
3156 }

引用了 main().

◆ TEST() [3/6]

acwing::acwing831::TEST ( acwing831  ,
case3   
)

在文件 acwing_test.cpp3158 行定义.

3158 {
3159 istringstream in("7\n"
3160 "aabaaaa\n"
3161 "11\n"
3162 "aabaaabaaaa");
3163 auto out = ostringstream();
3164 main(in, out);
3165 const auto ans = out.str();
3166 ASSERT_EQ("4 ", ans);
3167 }

引用了 main().

◆ TEST() [4/6]

acwing::acwing831::TEST ( get_next  ,
case1   
)

在文件 acwing_test.cpp3169 行定义.

3169 {
3170 const string str = "ababaa";
3171 const vector next = {0, 0, 1, 2, 3, 1};
3172 ASSERT_EQ(next, get_next(str));
3173 }

引用了 get_next().

◆ TEST() [5/6]

acwing::acwing831::TEST ( get_next  ,
case2   
)

在文件 acwing_test.cpp3175 行定义.

3175 {
3176 const string str = "ababaaababaa";
3177 const vector next = {0, 0, 1, 2, 3, 1, 1, 2, 3, 4, 5, 6};
3178 ASSERT_EQ(next, get_next(str));
3179 }

引用了 get_next().

◆ TEST() [6/6]

acwing::acwing831::TEST ( get_next  ,
case3   
)

在文件 acwing_test.cpp3181 行定义.

3181 {
3182 const string str = "aabaaaa";
3183 const vector next = {0, 1, 0, 1, 2, 2, 2};
3184 ASSERT_EQ(next, get_next(str));
3185 }

引用了 get_next().