暑假集训day9

今天主要将讲与字符串有关的吧。

1.trie树

Remember the Word(LA_3942)

trie树的模板题了。如果trie树不知道可以看蓝书(算法竞赛入门经典第一版)(以下的KMP和AC自动机都可以在此书上看到)。

#include<cstring>
#include<vector>
#include<cstdio>
#include<iostream>
using namespace std;
const int mn=400010,mod=20071027;char ch[300010],w[101];
int T[mn][26],val[mn],sz=1,d[300010],len[4010],S,cnt=0;
void add(char *s,int v){
    int u=0,l=strlen(s);
    for(int i=0;i<l;i++){
        int c=(int)(s[i]-‘a‘);
        if(!T[u][c]){
            memset(T[sz],0,sizeof(T[sz]));
            val[sz]=0;T[u][c]=sz++;
        }u=T[u][c];
    }val[u]=v;
}
void find(char *s,int len,vector<int>& ans){
    int u=0;for(int i=0;i<len;i++){
        if(s[i]==‘\0‘)break;int c=(int)(s[i]-‘a‘);
        if(!T[u][c])break;u=T[u][c];
        if(val[u])ans.push_back(val[u]);
    }
}
int main(){
    while(scanf("%s%d",ch,&S)!=EOF){
        sz=1;memset(T[0],0,sizeof(T[0]));
        for(int i=1;i<=S;i++){scanf("%s",w);len[i]=strlen(w);add(w,i);}
        memset(d,0,sizeof(d));int l=strlen(ch);d[l]=1;
        for(int i=l-1;i>=0;i--){
            vector<int>p;find(ch+i,l-i,p);
            for(int j=0;j<p.size();j++)d[i]=(d[i]+d[i+len[p[j]]])%mod;
        }
        printf("Case %d: %d\n",++cnt,d[0]);
    }return 0;
}

2.KMP

这个算法比较难理解,但是很好记,效率O(n+m)。

Oulipo(poj_3461)

#include<cstring>
#include<vector>
#include<cstdio>
#include<iostream>
using namespace std;
int f[10010],ans;char w[10010],t[1000010];
void getfail(){
    f[0]=f[1]=0;int m=strlen(w);
    for(int i=1;i<m;i++){
        int j=f[i];
        while(j&&w[i]!=w[j])j=f[j];
        f[i+1]=(w[i]==w[j]?j+1:0);
    }
}
void find(){
    getfail();int j=0,n=strlen(t),m=strlen(w);
    for(int i=0;i<n;i++){
        while(j&&w[j]!=t[i])j=f[j];
        if(w[j]==t[i])j++;if(j==m)ans++;
    }
}
int main()
{
    int n;scanf("%d",&n);
    while(n--){
        memset(f,0,sizeof(f));ans=0;
        scanf("%s%s",w,t);find();
        printf("%d\n",ans);
    }
    return 0;
}

Period(poj_1961)

#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int mk=1000010;
char c[mk];int k,f[mk],cnt=0;
void getfail(){
    f[0]=f[1]=0;
    for(int i=1;i<k;i++){
        int j=f[i];
        while(j&&c[i]!=c[j])j=f[j];
        f[i+1]=(c[i]==c[j]?j+1:0);
    }
}
int main()
{
    scanf("%d",&k);
    while(k){
        scanf("%s",c);
        getfail();printf("Test case #%d\n",++cnt);
        for(int i=2;i<=k;i++)
            if(f[i]&&i%(i-f[i])==0)
                printf("%d %d\n",i,i/(i-f[i]));
        puts("");scanf("%d",&k);
    }
    return 0;
}

Power Strings(poj_2406)

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1000010;
int f[N],k;char c[N];
void getfail(){
    f[0]=f[1]=0;
    for(int i=1;i<k;i++){
        int j=f[i];
        while(j&&c[i]!=c[j])j=f[j];
        f[i+1]=(c[i]==c[j]?j+1:0);
    }
}
int main()
{
    while(1){
        scanf("%s",c);
        if(c[0]==‘.‘)break;
        k=strlen(c);getfail();
        if(f[k]&&k%(k-f[k])==0)printf("%d\n",k/(k-f[k]));
        else puts("1");
    }
    return 0;
}

3.AC自动机(aho-corasick自动机)

本算法是结合了以上的trie树和KMP算法。

(暂缺)。

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-12-28 01:31:46

暑假集训day9的相关文章

暑假集训day9补充(AC自动机)

推荐网站http://blog.csdn.net/niushuai666/article/details/7002823 AC自动机嘛,此AC(aho-corasick)非彼AC(Accepted). 我也不是很会解释 有一题是必须打的hdu2222. #include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int mn=

2017暑假集训前总结和规划

距离大一进来已经一年了啊,感觉还是啥也不会,哎,太差了,总结一下这一年都学了写什么吧! 大一寒假开始专题,刷过的有:dp,dfs和bfs,数论(gcd拓展gcd,欧拉定理等等,但是中国剩余定理没学,等复习的时候再学吧),并查集,最短路(bellman-fprd,dijkstra,floyd-warshall,spfa),最小生成树(prim,kruskal),线段树,二分三分 大一下学期有:拓扑排序,基础计算几何(直线线段相交,快速排除实验,跨立实验),矩阵快速幂,博弈基础(nim博弈,威佐夫博

暑假集训0815

最近打了两场多校和一场中期比赛 中期比赛的话也就那么回事= =水题集合(从各种意义上 两场多校被各种虐,已经弱到谁都可以上(rbq)的程度了TOT 团队配合还要慢慢磨合,毕竟刚刚组队不久 这两次比赛有好几题都是差一点就想出来,毕竟还是图样 继续加油(shui)吧 还有就是一定要好好读题啊!最好读完题之后就手算一下数据,以防理解错题意.如果理解错了不会做就罢了,像中期比赛的时候读完题愉悦的打完代码才发现理解错题意了简直不能忍(论坑队友的正确姿势) Multi-University Training

暑假集训7.11 字符串回文暴力

#include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef unsigned long long ull; #define MM(a,b) memset(a,b,sizeof(a)); const double eps = 1e-10; const int i

暑假集训0808

来HIT参加暑假集训也有将近一周了,一直什么都没写= =. 记一下今天的比赛吧,以后争取每天更新一篇总结. 我是弱比.只能出6题. A:POJ1417 很容易发现yes表示两个人是同一类,no是不同类,然后怎么判断方案是否唯一我就不会了...我是有多么的弱...类似于背包DP,就是用前i个大类填满j个人数的方案. B:HDU1711 裸KMP C:POJ 2503 一个字典的实现.很显然的Trie.(我就想说出题人就不能给个n么..读入麻烦死..) D:POJ2828  比赛的时候还是想的有问题

2017暑假集训~心路历程

2017年暑假集训的个人赛阶段已经结束了. 回想这7场比赛,前几场发挥的还可以. 但是第4场之后开始状态开始下滑.第4场是在TOJ上做的,题数马马虎虎,就是罚时有点多. 第5场的FOJ的比赛打得十分糟糕.因为并不熟悉这个OJ, 赛前测试工作也没有作足. 比赛的时候各种意想不到的CE,WA.这样一来我前两小时只过了一题. 不过最后两小时至少翻到了不至于垫底的位置…… 第6场发挥也不好,被一道树形DP搞住了(这应该是我的强项),卡了一个半小时发现自己题目读错了.结果还是想不出来……然后另一道贪心因为

暑假集训(2)第五弹 ----- Who&#39;s in the Middle(poj2388)

G - Who's in the Middle Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description FJ is surveying his herd to find the most average cow. He wants to know how much milk this 'median

暑假集训练习赛题解

比赛链接:http://acm.nyist.net/JudgeOnline/problemset.php?cid=205 对于第一道题 UFS(Union  Find  Set) ,请参见http://blog.csdn.net/u011632342/article/details/37814289,题目大意一样,解法一样,不过后台测试数据还没整太多,数据比较弱... 对于第二道题STR(STRing),本来是想着给大家"送福利"呢,可能由于我的题目表述能力不太好或者样例数据的特殊性或

ACM暑假集训总结

暑假集训总结 回想去年暑假集训,和boblee.yyd组队时,他们为了复习考研,只有我一人默默的在基地训练,再到今年和yj.cq组队,三人能在基地一起刷题训练.再回想去年暑假自己作为新人,只能抱着两位队友的大腿,到今年作为一队的成员,要挑起集训队的大梁.从去年的全俱乐部开黑只能压线过几场网络赛,再到今年的队伍间各自做题,照样能没什么压力的通过网赛.亲眼见证俱乐部由弱到强,由不为人知到众所周知,自己不仅感触颇多,也同样敬佩起当初办起这个俱乐部的创始人们. 作为一个刚刚接触OI就要面临高考的人,才刚