http://acm.hdu.edu.cn/showproblem.php?pid=3336 題目
這是喵嗚大神用KMP做的,46MS
#include <stdio.h>#define MOD 10007char b[200005];int dp[200005];int p[200005];int n;int Pre(){ int s,i,j; dp[0]=1; j=-1; p[0]=-1; s=1; for (i=1;i<n;i++) { while(j>=0 && b[j+1]!=b[i]) j=p[j]; if (b[j+1]==b[i]) j++; if (j>=0) dp[i]=(dp[j]+1)%MOD; else dp[i]=1; p[i]=j; s=(s+dp[i])%MOD; } return s;}int main(){ int i,j,T; scanf("%d",&T); while(T--) { scanf("%d",&n); scanf("%s",b); printf("%d\n",Pre()); } return 0;}
這是更優的,15MS
思路:1、首先確定這個字串的首字母,然後從第二個開始搜起當遇到和首字元一樣的時候,就從該字母開始後面的字元繼續和這個字串的首字元後續的字元進行比較,直到出現不一樣為止,此時相同的字元個數就加到總數上。2、然後繼續 從首字元下一個字元開始,和1步驟差不多,就是這個字元和前面的字元一起往後比較,遇到不一樣又重複這個步驟。。。
#include <stdio.h>char str[200005];int main(){ int t,n,i,j,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); sum=n; sum%=10007; scanf("%s",str); for(i=1;i<n;i++) { if(str[i]==str[0]) { for(j=i;j<n;j++) { if(str[j]!=str[j-i]) break; } sum+=j-i; sum%=10007; } } printf("%d/n",sum); } return 0;}