Sicily 1282. Computer Game

题目地址:1282. Computer Game

思路:

     KMP算法,网上有很多资料,参考了一些网上的解题,收获很大,很感谢那些大神们!!!

     通过这道题简单说说我对KMP算法的理解吧(大神们勿喷,虽然没人看我的orz~~~~囧)。

     首先输入的是要匹配的字符串,如果这个字符串的首字母在整个字符串不重复出现的话,直接一直匹配下去即可。

     诶,那重复出现了怎么办,那就从最后一个重复出现的重新开始匹配,那么这就找到优化算法的好方法了,KMP算法的精髓大致是这样的。

     这道题具体代码如下:

 1 #include <iostream>

 2 #include <cstdio>

 3 using namespace std;

 4 

 5 int main() {

 6     int len1, len2;

 7     while (cin >> len1) {

 8         int code[60001] = {0}; 

 9         int next[60001] = {0};

10         for (int i = 1; i <= len1; i++) {

11             scanf("%d", &code[i]);

12         }

13         int index = 0;

14         for (int i = 2; i <= len1; i++) {

15             index = code[index+1] == code[i] ? index+1 : 0;

16             next[i] = index;

17         }

18         cin >> len2;

19         index = 0;

20         int test, result;

21         for (int i = 1; i <= len2; i++) {

22             scanf("%d", &test);

23             if (index != len1) {

24                 index = code[index+1] == test ? index+1 : next[index];

25                 if (index == len1) {

26                     result = i-len1;

27                 }

28             }

29         }

30         index == len1 ? cout << result << endl : cout << "no solution\n";

31     }

32     

33     return 0;

34 } 

 

你可能感兴趣的:(game)