Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 5636 Accepted Submission(s): 2654
1 4 abab
6
#include <cstdio> #include <cstring> #define LL long long #define MAX 200000+10 #define MOD 10007 using namespace std; char P[MAX], T[MAX]; int f[MAX]; LL dp[MAX];//存储前i个字符构成的字符串 在原串中出现的个数 void getfail() { int i, j; f[0] = f[1] = 0; int len = strlen(P); for(i = 1; i < len; i++) { j = f[i]; while(j && P[i] != P[j]) j = f[j]; f[i+1] = P[i]==P[j]?j+1:0; } } int main() { int t, n; int i, j; LL sum; scanf("%d", &t); while(t--) { scanf("%d", &n); scanf("%s", P); getfail(); sum = 0; dp[0] = 0; for(i = 1; i <= n; i++) { dp[i] = (dp[f[i]]%MOD + 1) % MOD; sum = (sum%MOD + dp[i]%MOD) % MOD; } printf("%lld\n", sum); } return 0; }
#include <cstdio> #include <cstring> #define MAX 200000+10 #define MOD 10007 #define LL long long using namespace std; char P[MAX]; int f[MAX]; LL dp[MAX]; void getfail() { int i = 0, j = -1; int len = strlen(P); f[0] = -1; while(i < len) { if(j == -1 || P[i] == P[j]) f[++i] = ++j; else j = f[j]; } } int main() { int t, n; LL sum; scanf("%d", &t); while(t--) { scanf("%d", &n); scanf("%s", P); getfail(); sum = dp[0] = 0; for(int i = 1; i <= n; i++) { dp[i] = (dp[f[i]]%MOD + 1) % MOD; sum = (sum%MOD + dp[i]%MOD) % MOD; } printf("%lld\n", sum); } return 0; }