UVA 10679 I love Strings!!!(AC自己主动机)
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1620
ProblemG
ILove Strings!!!
Input:Standard Input
Output:Standard Output
TimeLimit: 4 Seconds
Hmmmmmm…………strings again :) Then it must be an easy task for you. You are given with a string S of length less than 100,001, containing only characters from lower and uppercase English alphabet (‘a’-‘z’and ‘A’ – ‘Z’).
Then follows q (q < 100) queries where each query contains a string T of maximum length 1,000(also contains only ‘a’-‘z’ and ‘A’ – ‘Z’). You have to determine whether or not T is a sub-string of S.
Input
First line contains aninteger k (k < 10) telling the number of test cases to follow.Each test case begins with S. It is followed by q.After this line there are q lines each of which has a string T as defined before.
Output
For each query print ‘y’if it is a sub-string of S or ‘n’ otherwise followed by a newline. See the sample output below.
Sample Input
2
abcdefghABCDEFGH
2
abc
abAB
xyz
1
xyz
Output for Sample Input
y
n
y
Problemsetter: MohammadSajjad Hossain
题意:
给出一个文本串和若干个模式串,问模式串是否在文本串中出现过。
分析:
简单粗暴的AC自己主动机模板题。要注意模式串可能有反复的情况。
/*
*
* Author : fcbruce
*
* Time : Sat 04 Oct 2014 03:30:15 PM CST
*
*/
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
#define sqr(x) ((x)*(x))
#define LL long long
#define itn int
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
#define eps 1e-10 #ifdef _WIN32
#define lld "%I64d"
#else
#define lld "%lld"
#endif #define maxm
#define maxn 1000007
#define maxsize 52 using namespace std; int q[maxn<<1];
int _id[1007];
char YN[1007];
char query[1007];
char T[maxn]; struct Trie
{
int ch[maxn][maxsize];
int val[maxn];
int sz;
Trie()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
void clear()
{
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
int idx(const char ch)
{
if (islower(ch)) return ch-'a'+26;
return ch-'A';
} int insert(const char *s,int v=1)
{
int u=0,l=strlen(s);
for (int i=0;i<l;i++)
{
int c=idx(s[i]);
if (ch[u][c]==0)
{
val[sz]=0;
memset(ch[sz],0,sizeof ch[0]);
ch[u][c]=sz++;
}
u=ch[u][c];
} if (val[u]!=0) return val[u];
return val[u]=v;
}
}; struct ACauto :public Trie
{
int cnt;
int last[maxn];
int nex[maxn]; ACauto()
{
cnt=0;
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
}
void clear()
{
cnt=0;
sz=1;
val[0]=0;
memset(ch[0],0,sizeof ch[0]);
} void calc(int j)
{
if (j!=0)
{
YN[val[j]]='y';
calc(last[j]);
}
} void get_fail()
{
int f=0,r=-1;
nex[0]=0;
for (int c=0;c<maxsize;c++)
{
int u=ch[0][c];
if (u!=0)
{
nex[u]=0;
q[++r]=u;
last[u]=0;
}
} while (f<=r)
{
int x=q[f++];
for (int c=0;c<maxsize;c++)
{
int u=ch[x][c];
if (u==0) continue;
q[++r]=u;
int v=nex[x];
while (v>0 && ch[v][c]==0) v=nex[v];
nex[u]=ch[v][c];
last[u]=val[nex[u]]>0? nex[u]:last[nex[u]];
}
}
} void find(const char *T)
{
get_fail();
for (int i=0,j=0;T[i]!='\0';i++)
{
int c=idx(T[i]);
while (j>0 && ch[j][c]==0) j=nex[j];
j=ch[j][c];
if (val[j]!=0)
calc(j);
else if (last[j]!=0)
calc(last[j]);
}
}
}acauto; int main()
{
#ifdef FCBRUCE
freopen("/home/fcbruce/code/t","r",stdin);
#endif // FCBRUCE int T_T;
scanf ("%d",&T_T); while (T_T--)
{
acauto.clear();
scanf("%s",T); int n;
scanf("%d",&n); for (int i=1;i<=n;i++)
{
scanf("%s",query);
_id[i]=acauto.insert(query,i);
YN[i]='n';
} acauto.find(T); for (int i=1;i<=n;i++)
printf("%c\n",YN[_id[i]]);
} return 0;
}
UVA 10679 I love Strings!!!(AC自己主动机)的更多相关文章
- 【UVA】1449-Dominating Patterns(AC自己主动机)
AC自己主动机的模板题.须要注意的是,对于每一个字符串,须要利用map将它映射到一个结点上,这样才干按顺序输出结果. 14360841 1449 option=com_onlinejudge& ...
- uva 11468 - Substring(AC自己主动机+概率)
题目链接:uva 11468 - Substring 题目大意:给出一些字符和各自字符相应的选择概率.随机选择L次后得到一个长度为L的字符串,要求该字符串不包括随意一个子串的概率. 解题思路:构造AC ...
- 【UVA】11468-Substring(AC自己主动机)
AC自己主动机的题,须要注意的,建立失配边的时候,假设结点1失配边连到的那个结点2,那个结点2是一个单词的结尾,那么这个结点1也须要标记成1(由于能够看成,这个结点包括了这个单词),之后在Trie树上 ...
- POJ 3691 & HDU 2457 DNA repair (AC自己主动机,DP)
http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...
- hdu4758 Walk Through Squares (AC自己主动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- poj 3691 DNA repair(AC自己主动机+dp)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5877 Accepted: 2760 Descri ...
- HDOJ 5384 Danganronpa AC自己主动机
AC自己主动机裸题 Danganronpa Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java ...
- HDU - 4758 Walk Through Squares (AC自己主动机+DP)
Description On the beaming day of 60th anniversary of NJUST, as a military college which was Secon ...
- hdu5384 AC自己主动机模板题,统计模式串在给定串中出现的个数
http://acm.hdu.edu.cn/showproblem.php?pid=5384 Problem Description Danganronpa is a video game franc ...
随机推荐
- [ CodeVS冲杯之路 ] P1068
不充钱,你怎么AC? 题目:http://codevs.cn/problem/1068/ 这是一道神DP题,一开始状态设计错了,用位置和剩余卡片做下标,过了样例数据WA了 好了,讲正解,设 f[i][ ...
- [9018_1563][bzoj_2144]跳跳棋
题目描述 Hzwer的跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 某一天,黄金大神和cjy用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.他们 ...
- 安装python 科学计算库
http://www.softpedia.com/get/Programming/Other-Programming-Files/Python-x-y.shtml Pythonxy兴趣小组QQ群237 ...
- Codeforces #105 DIV2 ABCDE
开始按照顺序刷刷以前的CF. #include <map> #include <set> #include <list> #include <cmath> ...
- libevent源码分析之信号处理
新看看官方demo的libevent如何使用信号 int called = 0; static void signal_cb(int fd, short event, void *arg) { str ...
- Selenium2+python自动化2-pip降级selenium3.0【转载】
selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium默默的升级到了3.0,然而网上的教程都是 ...
- python cProfile分析程序性能
转自:http://xianglong.me/article/analysis-python-application-performance-using-cProfile/?utm_source=tu ...
- 解决win10下微信开发者工具点击错位问题
在系统设置->显示->更改文本.应用等项目的大小选项中将百分比改为100%即可.
- 微软官方的精简版Windows 7——Windows Thin PC
Windows Thin PC是微软的Window 7的精简版本,它的一个非常明显的特点是系统资源占用小.如下是官方的系统配置需求: CPU: 主频1 GHz 内存: 1GB(实际占用约5 ...
- JAVA 线程池以及其他
http://www.cnblogs.com/dolphin0520/ http://www.cnblogs.com/absfree/category/801869.html