题面戳我

Solution

  • 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还是空余的,我们都可以发现,这个字符串可以改成\(a+A'+X+B'+b\),所以下一次砍掉两边,这个\(A'\)中没有\(a\)与\(B'\)匹配,\(B'\)中同理没有\(b\)与\(A'\)匹配,所以公共串长度至少\(-2\)。
  • 有了上面那个性质,我们再倒着来做,我们把砍掉两边改成在两边加上两个字符,那么这次答案,至多是上次答案\(+2\),那么答案就只能从\(lastans+2,lastans,\cdots,1\)中查找,我们如果判断到一个答案符合前缀和后缀一样,我们就可把这个数作为答案,直接\(break\)即可,长度\(1\)的子串前缀和后缀都没有答案就是\(-1\)。
  • 我们来验证下时间复杂度的正确性,因为我们每次都是从\(lastans+2\),开始然后向后减,其实就与\(KMP\)一样(我不会),减的次数由加的次数决定,然后我们加的次数不会多于\(n/2+1\),忽略常数,再加上\(Hash\),所以我们就可以证明时间复杂度大概是\(O(n)\)的了
  • 判断字符串相同用\(Hash\)

Code

//It is coded by ning_mew on 7.23
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int maxn=1e6+7; int n;
char ch[maxn];
LL MOD[3]={19260817,20000909,19491001};
LL Hash[3][maxn],Pow[3][maxn];
int ans[maxn]; bool check(int s,int len){
int mid,t;
if(n%2){mid=(n+1)/2;t=2*mid-s;}
else {mid=n/2;t=mid-s+mid+1;}
for(int i=0;i<3;i++){
int box1=((Hash[i][s+len-1]-Hash[i][s-1]*Pow[i][len])%MOD[i]+MOD[i])%MOD[i];
int box2=((Hash[i][t]-Hash[i][t-len]*Pow[i][len])%MOD[i]+MOD[i])%MOD[i];
if(box1!=box2)return false;
}return true;
}
void work1(){
ans[(n+1)/2]=-1;
for(int i=(n+1)/2-1;i>=1;i--){
//cout<<"----------------------"<<endl;
ans[i]=-1;
for(int k=ans[i+1]+2;k>=1;k-=2){
//cout<<k<<endl;
if(check(i,k)){ans[i]=k;break;}
}
}
for(int i=1;i<=(n+1)/2;i++){printf("%d ",ans[i]);} printf("\n");
}
void work2(){
if(ch[n/2]==ch[n/2+1])ans[n/2]=1;else ans[n/2]=-1;
for(int i=n/2-1;i>=1;i--){
ans[i]=-1;
for(int k=ans[i+1]+2;k>=1;k-=2){
//cout<<k<<endl;
if(check(i,k)){ans[i]=k;break;}
}
}
for(int i=1;i<=n/2;i++){printf("%d ",ans[i]);} printf("\n");
}
int main(){
scanf("%d",&n);scanf("%s",ch+1); for(int j=0;j<3;j++){
Pow[j][0]=1;
for(int i=1;i<=n;i++){
Hash[j][i]=(Hash[j][i-1]*27+ch[i]-'a')%MOD[j];
Pow[j][i]=Pow[j][i-1]*27%MOD[j];
}
}
if(n%2)work1();else work2();
return 0;
}

博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/Ning-Mew/,否则你会场场比赛爆0!!!

【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)的更多相关文章

  1. codeforces gym 101164 K Cutting 字符串hash

    题意:给你两个字符串a,b,不区分大小写,将b分成三段,重新拼接,问是否能得到A: 思路:暴力枚举两个断点,然后check的时候需要字符串hash,O(1)复杂度N*N: 题目链接:传送门 #prag ...

  2. 【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)

    题面戳我 Solution 首先长度为偶数可以直接判掉 然后我们可以枚举删的位置,通过预处理的\(hash\),判断剩余部分是否划分成两个一样的 判重要注意,我们把字符串分为三个部分\(L_l+1+L ...

  3. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  4. 【codeforces 514C】Watto and Mechanism(字符串hash)

    [题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...

  5. LA4671 K-neighbor substrings(FFT + 字符串Hash)

    题目 Source http://acm.hust.edu.cn/vjudge/problem/19225 Description The Hamming distance between two s ...

  6. CodeForces - 727E Games on a CD 字符串Hash

    题意:有n个单词,每个单词长度为k,顺时针将它们写成一个圆圈串.现在知道g个长度为k的单词,是否可以从这g个单词中选择n个形成这个圆圈串?如果有多个答案,任意输出一个. 思路 可以发现,如果枚举第一个 ...

  7. CodeForces 1056E - Check Transcription - [字符串hash]

    题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...

  8. 线段树 + 字符串Hash - Codeforces 580E Kefa and Watch

    Kefa and Watch Problem's Link Mean: 给你一个长度为n的字符串s,有两种操作: 1 L R C : 把s[l,r]全部变为c; 2 L R d : 询问s[l,r]是 ...

  9. Codeforces 898F - Restoring the Expression(字符串hash)

    898F - Restoring the Expression 思路:字符串hash,base是10,事实证明对2e64取模会T(也许ull很费时),对1e9+7取模. 代码: #include< ...

随机推荐

  1. 【LeetCode232】 Implement Queue using Stacks★

    1.题目描述 2.思路 思路简单,这里用一个图来举例说明: 3.java代码 public class MyQueue { Stack<Integer> stack1=new Stack& ...

  2. .NET Core 3.0 跟踪

    Preview1: https://blogs.msdn.microsoft.com/dotnet/2018/12/04/announcing-net-core-3-preview-1-and-ope ...

  3. WebApi系列~HttpClient的性能隐患 - 转

    最近在进行开发过程中,基于都是接口开发,A站接口访问B接口接口来请求数据,而在这个过程中我们使用的是HttpClient这个框架,当然也是微软自己的框架,性能当前没有问题,但如果你直接使用官方的写法, ...

  4. WPF模拟探照灯文字

    原文:WPF模拟探照灯文字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/yangyisen0713/article/details/1835936 ...

  5. 2017NOIP游记

    记得去年这个时候,大概刚接触OI.没想到时间这么快,第一次2017NOIP之旅已经结束.初测成绩出来了,100+100+95+50=345,有浙江三十几名(@Cptraser 机房370大佬).总体感 ...

  6. postgresql总结

    这篇博客主要对PostgreSQL进行总结,内容偏基础. 这里先附上一个PostgreSQL的中文资源:PostgreSQL 8.1 中文文档.英文不好的同学可以看看这个. 安装PostgreSQL ...

  7. taro之React Native 端开发研究

    初步结论:如果想把 React Native 集成到现有的原生项目中,不能使用taro的React Native 端开发功能(目前来说不能实现,以后再观察).   RN开发有2种模式: 1.一是原生A ...

  8. JS进阶系列之执行上下文

    function test(){ console.log(a);//undefined; var a = 1; } test(); 也许你会遇到过上面这样的面试题,你只知道它考的是变量提升,但是具体的 ...

  9. 把cnblogs变成简书 - cnblogs博客自定义皮肤css样式

    吐槽 博客园cnblogs作为老牌的IT技术博客类网站,为广大的开发者提供了非常不错的学习交流平台. 虽然博客内容才是重点,但是如果有赏心悦目的页面不更好吗! cnblogs可以更换博客模板,并且提供 ...

  10. [2019BUAA软件工程]结对编程感想

    结对编程感想 写在前面   本博客为笔者在完成软件工程结对编程任务后对于编程过程.最终得分的一些感想与经验分享.此外笔者还对于本课程的结对编程部分提出了一些建议. Tips Link 作业要求博客 2 ...