记录编号 |
168442 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Dec10]恐吓信 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
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;
}