題意:求每一個的前綴在母串中出現次數的總和。 AC代碼:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef long long LL; const int N=200005; const LL II=100000000; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int next[N],c[N],ans,len; char str[N]; void getNext(char *p) { memset(c,0,sizeof(c)); int j=0,k=-1; next[0]=-1;ans=0; while(j<len)//len是p的長度 { if(k==-1||p[j]==p[k]) { if(k!=-1) { c[j]=c[k]+1; ans+=c[j]; } j++; k++; next[j]=k; } else k=next[k]; } } int main() { int i,j,T; cin>>T; while(T--) { scanf("%d%s",&len,str); getNext(str); printf("%d\n",(ans+len)%10007); } return 0; } #include <iostream> #include <cstdio> #include <cstdlib> #include <cmath> #include <cstring> #include <string> #include <vector> #include <list> #include <deque> #include <queue> #include <iterator> #include <stack> #include <map> #include <set> #include <algorithm> #include <cctype> using namespace std; typedef long long LL; const int N=200005; const LL II=100000000; const int INF=0x3f3f3f3f; const double PI=acos(-1.0); int next[N],c[N],ans,len; char str[N]; void getNext(char *p) { memset(c,0,sizeof(c)); int j=0,k=-1; next[0]=-1;ans=0; while(j<len)//len是p的長度 { if(k==-1||p[j]==p[k]) { if(k!=-1) { c[j]=c[k]+1; ans+=c[j]; } j++; k++; next[j]=k; } else k=next[k]; } } int main() { int i,j,T; cin>>T; while(T--) { scanf("%d%s",&len,str); getNext(str); printf("%d\n",(ans+len)%10007); } return 0; }