Guest User

Untitled

a guest
Nov 21st, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.41 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long LL;
  5. const int MAXN=1e3+5;
  6. const int MAXM=1e5+5;
  7. const int mod=1e9+7;
  8.  
  9. int n,m,cnt[MAXN][30],f[MAXN][30],g[MAXN][30];
  10. char x[MAXN];
  11.  
  12. int main(){
  13. int aa; scanf("%d",&aa);
  14. while(aa--){
  15. scanf("%d",&m);
  16. scanf(" %s",x+1); n=strlen(x+1);
  17. memset(cnt,0,sizeof(cnt));
  18. int num=0;
  19. for(int j=1;j<=m;j++) cnt[1][x[j]-'a']++;
  20. for(int j=0;j<26;j++) num+=(cnt[1][j]!=0);
  21. for(int j=0;j<26;j++) if (cnt[1][j]!=0) f[1][j]=g[1][j]=num;
  22. for(int i=m+1;i<=n;i+=m){
  23. int tag=(i+m-1)/m; num=0;
  24. for(int j=1;j<=m;j++) cnt[tag][x[i+j-1]-'a']++;
  25. for(int j=0;j<26;j++) num+=(cnt[tag][j]!=0);
  26. for(int j=0;j<26;j++) f[tag][j]=g[tag][j]=10000000;
  27. for(int j=0;j<26;j++){
  28. if (cnt[tag][j]==0) continue;
  29. for(int k=0;k<26;k++){
  30. if (cnt[tag-1][k]==0) continue;
  31. f[tag][j]=min(f[tag][j],g[tag-1][k]+num-(j==k));
  32. }
  33. for(int k=0;k<26;k++){
  34. if (cnt[tag][k]==0) continue;
  35. if ((k!=j) || (k==j && cnt[tag][k]==m)) g[tag][k]=min(g[tag][k],f[tag][j]);
  36. }
  37. }
  38. }
  39. int ans=10000000;
  40. for(int i=0;i<26;i++)
  41. if (cnt[n/m][i]!=0) ans=min(ans,f[n/m][i]);
  42. printf("%d\n",ans);
  43. }
  44. return 0;
  45. }
Add Comment
Please, Sign In to add comment