记录编号 168442 评测结果 AAAAAAAAAA
题目名称 [USACO Dec10]恐吓信 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 C++ 运行时间 0.046 s
提交时间 2015-07-04 16:17:34 内存使用 0.89 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int SIZE=100010;
#define Nil NULL
class Suffix_Automaton{
public:
	class Node{
	public:
		int len;
		Node *suflink;
		Node *ch[26];
		void clear(void){
			len=0;
			suflink=Nil;
			memset(ch,0,sizeof(ch));
		}
		Node(){clear();}
	};
	Node *root,*last;
	int n;
	Node *lis[SIZE];
	int findpos(Node *a){
		if(a==Nil) return -1;
		for(int i=0;i<n;i++){
			if(lis[i]==a) return i;
		}
		return -2;
	}
	void print(Node *a){
		cout<<"地址: "<<findpos(a)<<endl;
		cout<<"len: "<<a->len<<endl;
		cout<<"suflink: "<<findpos(a->suflink)<<endl;
		for(int i=0;i<26;i++){if(a->ch[i]!=Nil){cout<<(char)('A'+i)<<" : "<<findpos(a->ch[i])<<endl;}}
		cout<<endl;
	}
	void clear(void){
		root=new Node;
		last=root;
		lis[0]=root;
		n=1;
	}
	Suffix_Automaton(void){clear();}
	void insert(char c){
		int k=c-'A';
		Node *cur=new Node;
		lis[n++]=cur;
		cur->len=last->len+1;
		Node *p=last;
		while(p!=Nil&&p->ch[k]==Nil){
			p->ch[k]=cur;
			p=p->suflink;
		}
		if(p==Nil) cur->suflink=root;
		else{
			Node *q=p->ch[k];
			if(p->len+1==q->len) cur->suflink=q;
			else{
				Node *clone=new Node;
				lis[n++]=clone;
				*clone=*q;
				clone->len=p->len+1;
				cur->suflink=clone;
				q->suflink=clone;
				while(p!=Nil&&p->ch[k]==q){
					p->ch[k]=clone;
					p=p->suflink;
				}
			}
		}
		last=cur;
	}
	Node* step(Node *p,char c,int &mt){
		int k=c-'A';
		while(p!=root&&p->ch[k]==Nil) p=p->suflink,mt=p->len;
		if(p->ch[k]!=Nil) mt++;
		return p->ch[k];
	}
	int calc(char T[],int L){
		Node *p=root;
		int now=0,ans=0,mt=0;
		for(int i=0;i<L;i++){
			now++;
			p=step(p,T[i],mt);
			if(mt<now){
				ans++;
				now=0;
				mt=0;
				p=root;
				i--;
			}
		}
		return ans+1;
	}
};
Suffix_Automaton AMT;
int N,M;
char S[SIZE],T[SIZE];
void work(void){
	for(int i=0;i<N;i++) AMT.insert(S[i]);
	int ans=AMT.calc(T,M);
	printf("%d\n",ans);
}
void read_str(char s[],int n){
	int tot=0;
	while(tot<n){
		scanf("%s\n",s+tot);
		tot+=strlen(s+tot);
	}
}
void read(void){
	scanf("%d%d",&N,&M);
	read_str(S,N);
	read_str(T,M);
}
int main(){
	freopen("thre_letter.in","r",stdin);
	freopen("thre_letter.out","w",stdout);
	read();
	work();
	return 0;
}