记录编号 213743 评测结果 AAAAAAAAAA
题目名称 [USACO Dec10]恐吓信 最终得分 100
用户昵称 Gravatarstdafx.h 是否通过 通过
代码语言 C++ 运行时间 0.040 s
提交时间 2015-12-13 12:18:26 内存使用 11.74 MiB
显示代码纯文本
#define MAXN 100010UL
#define MAXC 26UL
 
#include <cstdio>
#include <cstring>
 
int n,m,s[MAXN],t[MAXN];
 
struct SuffixAutomaton{
	int son[MAXN][MAXC],pre[MAXN],step[MAXN],last,cnt;
	inline void Push(int p){step[++cnt]=p;return;}
/*	inline void Print(){
		printf("cnt:%d\n",cnt);
		for(int i=0;i<=cnt;i++){
			printf("node  : %d \n",i);
			printf("	pre = > %d\n",pre[i]);
			for(int j=0;j<26;j++){
				if(!son[i][j]) continue;
				printf("	==> %c %d\n",j+'A',son[i][j]);
			}
			puts("");
		}
		return;
	}*/
	inline void Extend(int ch){
		Push(step[last]+1);
		int p=last,np=cnt,q,nq;
		for(;!son[p][ch];p=pre[p]) son[p][ch]=np;
		if(!p&&son[0][ch]==np) pre[np]=0;
		else{
			q=son[p][ch];
			if(step[q]==step[p]+1) pre[np]=q;
			else{
				Push(step[p]+1);
				nq=cnt;
				memcpy(son[nq],son[q],sizeof(son[q]));
				pre[nq]=pre[q];
				pre[q]=pre[np]=nq;
				for(;son[p][ch]==q;p=pre[p]) son[p][ch]=nq;
			}
		}
		last=np;
		return;
	}
	inline void Build(){
		for(int i=0;i<n;i++)
			Extend(s[i]);
		return;
	}
	inline int SP(int node,int ch,int &matched){
		while(node&&!son[node][ch]) node=pre[node],matched=step[node];
		if(son[node][ch]) matched++;
		return son[node][ch];
	}
	inline int Solve(){
		int Ans=1,len=0,matched=0,node=0;
		for(int i=0;i<m;i++){
			len++,node=SP(node,t[i],matched);
			if(matched<len) Ans++,i--,node=0,matched=0,len=0;
		}
		return Ans;
	}
}SAM;
 
inline void Read(int p[],int len){
	for(int i=0,c;i<len;){
		c=getchar();
		while(c<'A'||c>'Z') c=getchar();
		p[i++]=c-'A';
	}
	return;
}

int main(){
	freopen("thre_letter.in","r",stdin);
	freopen("thre_letter.out","w",stdout);
	scanf("%d%d",&n,&m);
	Read(s,n);Read(t,m);
	SAM.Build();
	//SAM.Print();
	printf("%d",SAM.Solve());
	return 0;
}