HDU 4763

KMP算法的应用,第一遍做想的有点复杂,想开一个hash数组维护,实践时候才发现兜兜转转一圈徒增代码复杂度,最后时空复杂度也上来了。好的算法一个很重要的特性就是可编写性。

#include <iostream>
#include <algorithm>
#include <queue>
#include <string>
#include <vector>
#include <stack>
#include <cstdio>
#include <cstring>
using namespace std;

const int maxl= 1e6+5;

char s[maxl];
int nx[maxl], kn[maxl];

void PreKmp(char *x, int m, int *n, int *kn)
{
	int i= 0, j= -1;
	kn[0]= n[0]= -1;

	while (i< m){
		while (j> -1 && x[i]!= x[j]){
			j= kn[j];
		}
		++i;
		++j;
		if (x[i]== x[j]){
			kn[i]= kn[j];
		}
		else{
			kn[i]= j;
		}
		n[i]= j;
	}
}

int main(int argc, char const *argv[])
{
	int N;
	scanf("%d", &N);
	while (N--){
		scanf(" %s", s);
		int l= strlen(s);

		PreKmp(s, l, nx, kn);
		int k= nx[l], flag= 0;
		while (k> 0){
			int ui= l-k;
			int i= k, j= 0;
			while (i< ui){
				while (j> -1 && s[i]!= s[j]){
					j= kn[j];
				}
				++i;
				++j;
				if (j>= k){
					flag= 1;
				}
			}
			if (flag){
				break;
			}
			else if (!flag){
				k= nx[k];
			}
		}
		printf("%d\n", k> 0 ? k : 0);
	}

	return 0;
}
posted @ 2021-03-30 22:10  IdiotNe  阅读(40)  评论(0编辑  收藏  举报