1. 程式人生 > >nyoj 1112 求次數 (map)

nyoj 1112 求次數 (map)

AC c++ aaaaaa 小寫 problem sca cstring 長度 n-1

求次數

時間限制: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
/**
    分析:該題是判斷 一個字符串中的長度為n的子串重復的次數
    方法:map <string, int>  ||  set <string> 
    模板1 (map):
        int ans = 0;
        map <string, int> my_map;
        pair <map <string, int> :: iterator, bool> pr;
        
        for (int i = 0; i <= str.size () - n; ++ i)
        {
            sub_str = str.substr (i, n);
            pr = my_map.insert (pair <string, int> (sub_str, 0));
            if (!pr.second)
            {
                ++ ans;
            }
        } 
        cout <<ans <<endl;
    
    模板2 (set):
        int ans = 0;
        set <string> my_set;
        pair <set <string> :: iterator, bool> pr;
        
        for (int i = 0; i <= str.size () - n; ++ i)
        {
            sub_str = str.substr (i, n);
            pr = my_set.insert (sub_str);
            if (!pr.second)
            {
                ans ++;
            }
        } 
        cout << ans <<endl;
*
*/

C/C++代碼實現 (map):

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <stack>
#include <queue>
#include <map>

using namespace std;

int main ()
{
    int T;
    scanf ("%d", &T);
    while (T --)
    {
        
int n, str_len, ans = 0; string str, mid_str; scanf ("%d", &n); cin >>str; str_len = str.size(); map <string, int> my_map; pair <map <string, int> :: iterator, bool> pr; for (int i = 0; i <=str_len - n; ++ i) { mid_str = str.substr (i, n); pr = my_map.insert (pair <string, int> (mid_str, 0)); if (!pr.second) { ++ ans; } } printf ("%d\n", ans); } return 0; }

C/C++代碼實現 (set):

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <stack>
#include <queue>
#include <map>
#include <set> 

using namespace std;

int main ()
{
    int T;
    scanf ("%d", &T);
    while (T --)
    {
        int n, str_len, ans = 0;
        string str, mid_str;
        scanf ("%d", &n);
        cin >>str;
        str_len = str.size();

        set <string> my_set;
        pair <set <string> :: iterator, bool> pr;

        for (int i = 0; i <=str_len - n; ++ i)
        {
            mid_str = str.substr (i, n);
            pr = my_set.insert (mid_str);
            if (!pr.second)
            {
                ++ ans;
            }
        }

        printf ("%d\n", ans);
    }
    return 0;
}

nyoj 1112 求次數 (map)