标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5512 Accepted Submission(s): 2596
/** 题意:给一个字符串,问字符串前缀的个数 做法:kmp 每次next[]数组记录的下标 前缀数组 **/ #include <iostream> #include <stdio.h> #include <cmath> #include <algorithm> #include <string.h> #define maxn 200000 + 10 #define mod 10007 using namespace std; char ch[maxn]; int mmap[maxn]; int Next[maxn]; void getnext(char *p) { int len = strlen(p); int j,k; j=0; k = -1; Next[0] = -1; while(j < len) { if(k == -1 || p[j] == p[k]) { j++; k++; Next[j] = k; } else k = Next[k]; } } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif // ONLINE_JUDGE int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); scanf("%s",ch); getnext(ch); mmap[0] = 0; int res= 0 ; for(int i=1;i<=n;i++) { mmap[i] = mmap[Next[i]] + 1; mmap[i] %= mod; res += mmap[i]; res %= mod; } printf("%d\n",res); } return 0; }
标签:
原文地址:http://www.cnblogs.com/chenyang920/p/4454583.html