
字符串
文章平均质量分 73
incredible_bly
这个作者很懒,什么都没留下…
展开
-
字符串专项:UVa 10298
基本的kmp,一遍kmp找出失配函数。然后如果n%(n-f[n])=0,就输出n/(n-f[n]),否则输出1即可。#include #include #include #include using namespace std;#define M 1000010char s[M];int f[M];int main(){ freopen("in.txt","r",st原创 2013-05-18 22:11:40 · 816 阅读 · 0 评论 -
字符串专项:CodeForces 235C
一道后缀自动机的算是模板题吧,可是我还是折腾了一个下午……总算对这个模板有了稍微深入的理解,debug了很久,也发现了不少的问题。现在算是基本会用后缀数组了。#include #include #include #include using namespace std;const int maxn=2000010;const int sigma=26;int n,sz;st原创 2013-10-24 10:31:06 · 703 阅读 · 0 评论 -
字符串专项:LA 4126
一道AC自动机+状压DP,将M个字符串建一个AC自动机,注意将字符串插入tire树时,注意可能会有多个字符公用一个尾结点,需要注意val值的更新。状态方程不难得出dp[dep][u][st]=sum{dp[dep+1][ch[u][i]][st|val[ch[u][i]]]|0#include #include #include #include using namespace s原创 2013-07-04 23:28:06 · 631 阅读 · 0 评论 -
字符串专项:LA 2755
这题一开始没什么想法,貌似可以用类似后缀数组的方法求,可是对实现后缀数组基数排序理解不够深,也不会写。后来看别人的代码,发现了一个简单而又高效的方法。应该算是扫描线吧,用两个指针,一个指向当前最优的串的首字母,另一个指向待比较的串的首字母,然后分3种情况讨论,这里还有一个记录前缀相同的长度的量。这里利用了一个性质,即比较过后的字符,如果不是最优,就一定不是最优了,所以指针不会回溯。这样时间复杂原创 2013-07-02 23:42:01 · 662 阅读 · 0 评论 -
字符串专项:UVa 11855
一道用后缀数组求LCP的模板题,后缀数组用的还是不够熟,细节掌握的还是不够好,RE了好多次……#include #include #include #include #include using namespace std;#define M 10010string str;int s[M],sa[M],t[M],t2[M],c[M],n;int rank[M],height原创 2013-06-29 23:06:10 · 610 阅读 · 0 评论 -
字符串专项:Ural 1423
一道很简单的kmp,可是脑残了WA了n炮。需要注意,当s与t相同时,输出0而非n。#include #include #include using namespace std;int n;char s[250010],t[250010];int f[250010];void getfail(){ f[0]=f[1]=0; for(int i=1;i<n;i++)原创 2013-06-28 22:27:04 · 673 阅读 · 0 评论 -
字符串专项:Ural 1723
根据题意,可以只统计单个字母重复出现最多的即可。#include #include #include using namespace std;char s[100];int cnt[30];int main(){ while(cin>>s) { int n=strlen(s); memset(cnt,0,sizeof(cnt));原创 2013-06-28 22:02:55 · 515 阅读 · 0 评论 -
字符串专项:Ural 1354
就是对逆串求一遍KMP,然后输出原串加上逆串未与原串匹配的部分。需要注意的是S2不能为空,所以当S2为空时,需要沿着失配边往回走一步。#include #include #include using namespace std;char s[10010],rs[10010];int n;int f[10010];void getfail(){ f[0]=f[1]=0;原创 2013-06-28 22:19:54 · 599 阅读 · 0 评论 -
字符串专项:Ural 1102
这题刚开始不是MLE就是RE,后来发现用string就没问题,不知道是什么机理……本来是用回溯法做的,结果各种WA,上网搜了下,发现有说什么有限状态自动机,完全不懂……然后发现用模拟也可以做,从后向前判断,否则相当复杂。#include #include #include using namespace std;string s;int main(){ int n;原创 2013-06-28 22:14:50 · 702 阅读 · 0 评论 -
字符串专项:LA 5913
一道tire树的应用,分别用前缀和后缀建tire树,tire树的边数(节点数-1)即为前后缀的总数,两者的乘积即为所有组合的总数。但是这样存在重复的组合,需要扣掉不与根相连的相同字母的边数乘积。最后还应考虑单个字母的情况。具体为什么这样,讲也很难讲清,仔细想一下应该可以明白。#include #include #include using namespace std;typedef l原创 2013-06-27 23:35:16 · 566 阅读 · 0 评论 -
字符串专项:hdu 2825
做的第一道状压加AC。真是各种悲剧……先是状态设计搓了MLE,然后因为递归TLE,看了题解改成迭代递推又WA。然后发现AC自动机最为重要的一点被我忽略了,就是节点标记的传递……改了之后才AC。其实这题算是比较裸的一道AC自动机加DP,状态很自然就可以想到。用dp[i][j][k]表示已经过i个结点,位于j结点,所达到的状态(即所包含的字串)。状态方程为:dp[i+1][ch][k|st原创 2013-05-10 21:15:34 · 590 阅读 · 0 评论 -
字符串专项:UVa 12012
一道基本的kmp,就是枚举头结点做kmp,然后再枚举子串的长度,沿着失配边走,当满足j%(j-f[t])==0时说明找到了一个由j/(j-f[t])个相同字符串构成的字串,迭代更新结果即可。#include #include #include #include using namespace std;#define M 1010char s[M];int f[M],n,ans[M原创 2013-05-08 22:25:31 · 628 阅读 · 0 评论 -
字符串专项:hdu 2222
一道AC自动机模板题,唯一需要注意的是注意判重。可以用一个map将字符串映射到其编号,最后遍历统计一遍即可。#include #include #include #include #include #include using namespace std;#define M 10010const int sigma=26;string text,p[M];int ch[60原创 2013-05-08 22:26:47 · 505 阅读 · 0 评论 -
字符串专项:UVa 11475
对原串的逆串做一次kmp,然后用原串去匹配到最后,然后返回最后匹配到的位置,即为所能匹配到的串尾的最长回文串。#include #include #include #include using namespace std;#define M 100010char s[M],rs[M];int f[M],n;void getfail(){ f[0]=f[1]=0;原创 2013-05-21 12:55:31 · 950 阅读 · 0 评论 -
字符串专项:LA 3490
先对原串做一遍kmp,然后对每个结点,建立状态转移矩阵,然后做高斯消元即可得到结果。注意这里不可以用实数运算,否则会因掉精度而WA,所以需要避免实数运算。#include #include #include #include using namespace std;const int maxn=20;typedef long long matrix[maxn][maxn];i原创 2013-10-19 23:18:06 · 680 阅读 · 0 评论