字符串

aaa
今天字符串专题
1) KMP
思想是对于每一位求出最长的后缀等于前缀的长度 next
周期:
字符串:【】【】【】【】【不完整周期】
【】就是周期
有一个周期就是串长减去 next,
所有周期长度都是最小周期的倍数;
如果串不是最小周期的倍数,则这个串没
有循环节。

【NOI2014 动物园】

点击查看代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll M=1e9+7;
ll n;
ll num[N];
ll kmp[N];
ll Ans(string str){
	ll len=str.size();
	ll ans=1;
	ll j=0;
	num[1]=1;
	for(ll i=1;i<len;i++){
		while(j&&(str[j]!=str[i])){
			j=kmp[j];
		}
		if(str[j]==str[i]) j++;
		kmp[i+1]=j;
		num[i+1]=num[j]+1;
	}
	j=0;
	for(ll i=1;i<len;i++){
			while(j&&(str[j]!=str[i])){
				j=kmp[j];
			}
			if(str[j]==str[i]) j++;
			while(j>(i+1)/2) j=kmp[j];
			ans=(ans*(num[j]+1))%M;;
		}
		
	return ans;
}
int main(){
	cin>>n;
	while(n--){
		string str;
		cin>>str;
		memset(kmp,0,sizeof(kmp));
		//memset(num,0,sizeof(num));
		cout<<Ans(str)<<endl;
	}
	return 0;
}
2)AC自动机 这里需要仔细解释一下 Trie 的结点的含义,尽管这很小儿科,但在之后的理解中极其重要。Trie 中的结点表示的是某个模式串的前缀。我们在后文也将其称作状态。一个结点表示一个状态,Trie 的边就是状态的转移。 fail 指针的意义:一个点的 fail 指针的意思是指向了从跟到这个点最长 的一节后缀的位置,因为每个点的 fail 指针是唯一的,所以我们可以建 出来一个 fail 树。 主串遍历:保留最长一个后缀进行匹配,能匹配上的 fail 树上所有祖先。 好吧,还有一大堆要补的啦,但是问题不大。。。
posted @ 2024-08-03 18:39  Euan?  阅读(20)  评论(0)    收藏  举报