String Accepts: 84 Submissions: 373
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个 10\leq10≤长度\leq 1,000,000≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1 \leq k \leq 26)k(1≤k≤26)个不同的字母?
输入描述
输入包含多组数据. 第一行有一个整数T (1\leq T\leq 10)T(1≤T≤10), 表示测试数据的组数. 对于每组数据:
第一行输入字符串SS。
第二行输入一个整数kk。
输出描述
对于每组数据,输出符合要求的子串的个数。
输入样例
2
abcabcabca
4
abcabcabcabc
3
输出样例
0
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
问题描述
有一个 10\leq10≤长度\leq 1,000,000≤1,000,000 的字符串,仅由小写字母构成。求有多少个子串,包含有至少k(1 \leq k \leq 26)k(1≤k≤26)个不同的字母?
输入描述
输入包含多组数据. 第一行有一个整数T (1\leq T\leq 10)T(1≤T≤10), 表示测试数据的组数. 对于每组数据:
第一行输入字符串SS。
第二行输入一个整数kk。
输出描述
对于每组数据,输出符合要求的子串的个数。
输入样例
2
abcabcabca
4
abcabcabcabc
3
输出样例
0
55
前加后减啦。。。。啦啦啦。。。。。。。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
__int64 s;
char ch[1001000];
int shu[30];
int main()
{
int t;scanf("%d",&t);
while (t--)
{
int k=0;int kp,pp,qian;
memset(shu,0,sizeof(shu));
scanf("%s",&ch);
scanf("%d",&n);
int chang=strlen(ch);
for (int i=0;i<chang;i++)
shu[ch[i]-'a']++;
for (int i=0;i<26;i++)
if (shu[i])
k++;
if (k<n)
{
printf("0\n");continue;
}
memset(shu,0,sizeof(shu));
qian=0;
s=0;k=0;
for (int i=0;i<chang;i++)
{
kp=ch[i]-'a';
if (shu[kp]!=0)
shu[kp]++;
else
{
shu[kp]++;
k++;
}
if (k==n)
{
s+=(chang-i);
while (1)
{
pp=ch[qian]-'a';
shu[pp]--;
qian++;
if (shu[pp]==0)
{
k--;break;
}
else
s+=(chang-i);
}
}
}
printf("%I64d\n",s);
}
return 0;
}