Count the string HDU
阿新 • • 發佈:2018-12-13
問每個字首可重疊地出現了多少次 最笨的方法就是對於每個i 不斷找next[i] 看找幾次到0 累加一下 但是aaaaaa直接是n^2 複雜度爆炸 這個過程中很多步都是重複走的 可以用和差分陣列類似的方法 在找的過程中不斷累加
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll mod=1e4+7; const int maxn=2e6+10; ll book[maxn]; int nxtt[maxn]; char ch[maxn]; void kmp(char *t,int lt) { int i,j; nxtt[0]=-1; i=0,j=-1; while(i<lt) { if(j==-1||t[i]==t[j]) { i++,j++; nxtt[i]=j; } else j=nxtt[j]; } } int main() { ll ans; int t,l,i; scanf("%d",&t); while(t--) { scanf("%d%s",&l,ch); kmp(ch,l); memset(book,0,sizeof(book)); for(i=l;i>=1;i--) book[nxtt[i]]=(book[nxtt[i]]+book[i]+1)%mod; ans=0; for(i=0;i<=l;i++) ans=(ans+book[i])%mod; printf("%lld\n",ans); } return 0; } /* 100 7 abcdabc 6 ababab 5 aaaaa 7 abababc */