BZOJ 1212: [HNOI2004]L语言
2016-03-30 16:12
411 查看
AC自动机水题
跑一遍就好了
跑一遍就好了
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; struct node{ int fail,len,ch[26]; void clear(){ fail=len=0; memset(ch,0,sizeof(ch)); } }tr[205]; int sz; void ins(char *s){ int u=0,n=strlen(s); for(int i=0;i<n;i++){ int c=s[i]-'a'; if(!tr[u].ch[c]){ tr[u].ch[c]=++sz; tr[sz].clear(); } u=tr[u].ch[c]; } tr[u].len=n; } void bfs(){ queue<int>q;q.push(0); while(!q.empty()){ int u=q.front();q.pop(); for(int i=0;i<26;i++) if(tr[u].ch[i]){ int v=tr[u].ch[i]; if(u)tr[v].fail=tr[tr[u].fail].ch[i]; q.push(v); }else tr[u].ch[i]=tr[tr[u].fail].ch[i]; } } bool f[1000005]; int dfs(char *s){ int n=strlen(s+1); memset(f,0,sizeof(f)); f[0]=1; int p=0; for(int i=1;i<=n;i++){ int c=s[i]-'a'; p=tr[p].ch[c]; if(!p)break; for(int q=p;q;q=tr[q].fail) f[i]|=f[i-tr[q].len]; } for(int i=n;i>=0;i--)if(f[i])return i; } char s[1000005]; int main(){ //freopen("a.in","r",stdin); int n,m;scanf("%d%d",&n,&m); tr[sz=0].clear(); for(int i=1;i<=n;i++){ scanf("%s",s);ins(s); } bfs(); while(m--){ scanf("%s",s+1); printf("%d\n",dfs(s)); } return 0; }
相关文章推荐
- magento 流程 手稿
- (OK) cBPM-CentOS——Criteria.xml——create-database
- (转)TableLayout中stretchColumns、shrinkColumns的用法
- Android RecyclerView 使用完全解析 体验艺术般的控件
- 一个计步器源代码的研究
- C语言之常用字符串处理函数(非调用)
- Spring配置概述
- Bean的生命周期
- BeanFactory 和 ApplicationContext
- 实验4颜色、字符串资源的使用
- opencv删除二值图中较小的噪点色块
- 2016年3月28日作业
- Ununtu14.04下安装Hadoop2.6.0常见问题解决
- 简单js之select操作案例
- UIView的alpha、hidden和opaque属性之间的关系和区别
- 基于QtQuick2.0应用程序运行于XP系统的诸多问题
- Linux和windows、Mac回车换行区别
- java的深度克隆
- <css 三>font
- DigitalOcean的Droplet怎么添加SSH Key和使用SSH Key登录