Sicily 1282. Computer Game

For study!

Posted by Winray on March 4, 2016
  • 思路:
    • KMP算法,网上有很多资料,参考了一些网上的解题,收获很大,很感谢那些大神们!!!
    • 通过这道题简单说说我对KMP算法的理解吧(大神们勿喷,虽然没人看我的orz~~~~囧)。
    • 首先输入的是要匹配的字符串,如果这个字符串的首字母在整个字符串不重复出现的话,直接一直匹配下去即可。诶,那重复出现了怎么办,那就从最后一个重复出现的重新开始匹配,那么这就找到优化算法的好方法了,KMP算法的精髓大致是这样的。
  • 具体代码如下:
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int len1, len2;
    while (cin >> len1) {
        int code[60001] = {0}; 
        int next[60001] = {0};
        for (int i = 1; i <= len1; i++) {
            scanf("%d", &code[i]);
        }
        int index = 0;
        for (int i = 2; i <= len1; i++) {
            index = code[index+1] == code[i] ? index+1 : 0;
            next[i] = index;
        }
        cin >> len2;
        index = 0;
        int test, result;
        for (int i = 1; i <= len2; i++) {
            scanf("%d", &test);
            if (index != len1) {
                index = code[index+1] == test ? index+1 : next[index];
                if (index == len1) {
                    result = i-len1;
                }
            }
        }
        index == len1 ? cout << result << endl : cout << "no solution\n";
    }
    
    return 0;
}