博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5056 BoringCount--线性扫一遍
阅读量:6162 次
发布时间:2019-06-21

本文共 2503 字,大约阅读时间需要 8 分钟。

11754936 2014-09-29 10:08:45 Accepted 31MS 392K G++

好简单的思路,怎么就没想到呢。。。。。

Boring count

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 250    Accepted Submission(s): 98

Problem Description
You are given a string S consisting of lowercase letters, and your task is counting the number of substring that the number of each lowercase letter in the substring is no more than K.
 
Input
In the first line there is an integer T , indicates the number of test cases. For each case, the first line contains a string which only consist of lowercase letters. The second line contains an integer K.
[Technical Specification] 1<=T<= 100 1 <= the length of S <= 100000 1 <= K <= 100000
 
Output
For each case, output a line contains the answer.
 
Sample Input
3 abc 1 abcabc 1 abcabc 2
 
Sample Output
6 15 21
 
Source
 
Recommend
heyang   |   We have carefully selected several similar problems for you:            

 

官方题解:

1003 Boring count

枚举字符串下标i,每次计算以i为结尾的符合条件的最长串。那么以i为结尾的符合条件子串个数就是最长串的长度。求和即可。
计算以i为结尾的符合条件的最长串两种方法:
1.维护一个起点下标startPos,初始为1。如果当前为i,那么cnt[str[i]]++,如果大于k的话,就while( str[startPos] != str[i+1] ) cnt[str[startPos]]--, startPos++; 每次都保证 startPos~i区间每个字母个数都不超过k个。ans += ( i-startPos+1 )。 时间复杂度O(n)
2.预处理出所有字母的前缀和。然后通过二分找出以i为结尾的符合条件的最长串的左边界。时间复杂度O(nlogn),写的不够好的可能超时。

 

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 11 #define N 10000512 #define M 1513 #define mod 1000000714 //#define p 1000000715 #define mod2 10000000016 #define ll long long17 #define LL long long18 #define maxi(a,b) (a)>(b)? (a) : (b)19 #define mini(a,b) (a)<(b)? (a) : (b)20 21 using namespace std;22 23 int T;24 int n;25 ll l;26 char s[N];27 ll ans;28 ll vis[30];29 ll k;30 ll te;31 32 void ini()33 {34 ans=0;35 scanf("%s",s);36 scanf("%I64d",&k);37 l=strlen(s);38 memset(vis,0,sizeof(vis));39 }40 41 42 void solve()43 {44 ll i;45 ll pre;46 pre=0;47 for(i=0;i
k){50 vis[ s[pre]-'a' ]--;51 pre++;52 }53 ans+=i-pre+1;54 }55 }56 57 void out()58 {59 printf("%I64d\n",ans);60 }61 62 int main()63 {64 //freopen("data.in","r",stdin);65 //freopen("data.out","w",stdout);66 scanf("%d",&T);67 // for(int ccnt=1;ccnt<=T;ccnt++)68 while(T--)69 // while(scanf("%d",&n)!=EOF)70 {71 // if(n==0 && m==0) break;72 //printf("Case %d: ",ccnt);73 ini();74 solve();75 out();76 }77 78 return 0;79 }

 

转载于:https://www.cnblogs.com/njczy2010/p/3999620.html

你可能感兴趣的文章
分析jQuery源码时记录的一点感悟
查看>>
程序局部性原理感悟
查看>>
UIView 动画进阶
查看>>
Spring如何处理线程并发
查看>>
linux常用命令(用户篇)
查看>>
获取组件的方式(方法)
查看>>
win2008 server_R2 自动关机 解决
查看>>
我的友情链接
查看>>
在C#调用C++的DLL简析(二)—— 生成托管dll
查看>>
Linux macos 常用终端操作
查看>>
企业网络的管理思路
查看>>
Linux磁盘分区与挂载
查看>>
J2se学习笔记一
查看>>
DNS视图及日志系统
查看>>
老李分享:Android性能优化之内存泄漏 3
查看>>
mysql命令
查看>>
来自极客标签10款最新设计素材-系列七
查看>>
极客技术专题【009期】:web技术开发小技巧
查看>>
PHP 简单计算器代码实现
查看>>
正则表达式的知识普及
查看>>