求次数
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
-
题意很简单,给一个数n 以及一个字符串str,区间【i,i+n-1】 为一个新的字符串,i 属于【0,strlen(str)】如果新的字符串出现过ans++,例如:acmacm n=3,那么 子串为acm cma mac acm ,只有acm出现过
求ans;
- 输入
- LINE 1: T组数据(T<10)
LINE 2: n ,n <= 10,且小于strlen(str);
LINE 3:str
str 仅包含英文小写字母 ,切长度小于10w - 输出
- 求 ans
- 样例输入
-
2 2 aaaaaaa 3 acmacm
- 样例输出
-
5 1
分析:关键是将出现过的字符串保存起来,判断一个新的字符串是否在之前保存的字符串集合中出现过,若出现过,则ans++
可以用map或者set1 #pragma warning(disable:4786) 2 #include <iostream> 3 #include <string> 4 #include <set> 5 #include <cstdio> 6 using namespace std; 7 8 int main(){ 9 int t, n, ans; 10 set<string> st; 11 string str, ss; 12 char s[100000]; 13 scanf("%d", &t); 14 while(t--){ 15 st.clear(); 16 ans = 0; 17 scanf("%d", &n); 18 scanf("%s", s); 19 str = s; 20 int lens = str.length(); 21 for(int i = 0; i < lens - n + 1; i++){ 22 int len = st.size(); 23 ss = str.substr(i, n); 24 st.insert(ss); 25 if(len == st.size())//用插入子串之前的set集合大小和之后的大小比较,判断是否出现过,也可以用st.find(ss) ?= st.end() 26 ans++; 27 else 28 len = str.size(); 29 } 30 cout << ans << endl; 31 } 32 return 0; 33 }
map:
1 #include <iostream> 2 #include <string> 3 #include <map> 4 #include <cstdio> 5 using namespace std; 6 7 int main(){ 8 int t, n, ans; 9 map<string, int> mp; 10 string str, ss; 11 char s[100000]; 12 scanf("%d", &t); 13 while(t--){ 14 mp.clear(); 15 ans = 0; 16 scanf("%d", &n); 17 scanf("%s", s); 18 str = s; 19 int lens = str.length(); 20 for(int i = 0; i < lens - n + 1; i++){ 21 ss = str.substr(i, n); 22 if(mp[ss] == 1) 23 ans++; 24 mp[ss] = 1; 25 } 26 cout << ans << endl; 27 } 28 return 0; 29 }