标签:io for ar art html amp line size
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 250000 + 10;
int tot;
struct Node
{
Node * ch[26],*f;
int l;
} nd[maxn << 1], *head, *last;
inline void add(int x)
{
Node * p = &nd[++ tot], *t = last;
p->l = last->l + 1; last = p;
for(; t && !t->ch[x] ;t = t->f) t->ch[x] = p;
if(!t) p->f = head;
else if(t->l + 1 == t->ch[x]->l) p->f = t->ch[x];
else
{
Node *r = &nd[++ tot], *q = t->ch[x];
*r = *q; r->l = t->l + 1; p->f = q->f = r;
for(; t && t->ch[x] == q ;t = t->f) t->ch[x] = r;
}
}
inline void init()
{
head = last = &nd[tot];
}
inline int scan(char *s)
{
int n = 1; for(s[0] = getchar();s[0] < ‘a‘ && s[0] > ‘z‘;s[0] = getchar());
for(s[n] = getchar();s[n] >= ‘a‘ && s[n] <= ‘z‘;s[n] = getchar()) n ++;
return n;
}
char str[maxn];
int main()
{
init();
int len = scan(str);
for(int i = 0;i < len;i ++) add(str[i] - ‘a‘);
len = scan(str);
Node *p = head; int ans = 0,t = 0;
for(int i = 0;i < len;i ++,ans = ans < t ? t : ans)
{
int x = str[i] - ‘a‘;
if(p->ch[x]) t ++,p = p->ch[x];
else
{
for(; p && !p->ch[x] ;p = p->f);
if(p) t = p->l + 1,p = p->ch[x];
else p = head,t = 0;
}
}
printf("%d\n",ans);
return 0;
}
/*
int debug()
{
init();
int len = scan(str);
for(int i = 0;i < len;i ++) add(str[i] - ‘a‘);
while(len = scan(str))
{
Node *p = head; int ok = 1;
for(int i = 0;i < len;i ++)
{
p = p->ch[str[i] - ‘a‘];
if(p == NULL) { ok = 0; break; }
}
puts((ok ? "Yes" : "No"));
}
return 0;
}
*/标签:io for ar art html amp line size
原文地址:http://www.cnblogs.com/vivym/p/3911234.html