P4391 [BOI2009]Radio Transmission 无线传输
这题可以说是kmp的简化版,也就是说只用求一下next数组,答案输出为n-next[n],那么为什么呢,其实这也很好想,next[i]存储的是下标为i的前缀与从头开始最长的相同前缀的尾下标,故next[n]表示的也就是除去第一个循环节之外的其他长度
#include<set> #include<map> #include<list> #include<queue> #include<stack> #include<string> #include<cmath> #include<ctime> #include<vector> #include<bitset> #include<memory> #include<utility> #include<cstdio> #include<sstream> #include<iostream> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int N=1000005; int n; char s[N]; int next[N]; void getnext(){ for(int i=2,j=0;i<=n;i++){ while(s[i]!=s[j+1]&&j){ j=next[j]; } if(s[i]==s[j+1]){ j++; } next[i]=j; } } int main(){ scanf("%d",&n); cin>>(s+1); getnext(); printf("%d\n",n-next[n]); return 0; }
我还是得抽时间整理一下kmp完整版和简化版的区别,有点略混。。