3 条题解

  • 0
    @ 2022-8-25 12:04:00
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    int n,m,tot;
    int trie[1000010][27],cnt[1000010];
    void in(char s[1000010]) {
        int len=strlen(s),p=0;
        for(int i=0;i<len;i++) {
            int ch=s[i]-'a';
            if(!trie[p][ch]) trie[p][ch]=++tot;
            p=trie[p][ch];
        }
        cnt[p]++;
    }
    int inster(char s[1000010]) {
        int ans=0;
        int len=strlen(s),p=0;
        for(int i=0;i<len;i++) {
            int ch=s[i]-'a';
            p=trie[p][ch];
            if(!p) return ans;
            ans+=cnt[p];
        }
        return ans;
    }
    int main()
    {
        char s[1000010];
        cin >> n >> m; 
        for(int i=1;i<=n;i++) {
            scanf("%s",s); in(s);
        }
        for(int i=1;i<=m;i++) {
            scanf("%s",s);
            printf("%d\n",inster(s));
        }
        return 0;
    }
    
    • 0
      @ 2021-8-7 20:43:20

      C++ :

      #include<iostream>
      #include<cstdio>
      #include<cstring>
      #include<cmath>
      #define Min(a,b) (a)<(b)?(a):(b)
      #define Max(a,b) (a)>(b)?(a):(b)
      #define in(i) (i=read())
      using namespace std;
      int read() {
          int ans=0,f=1; char i=getchar();
          while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
          while(i>='0' && i<='9') {ans=(ans<<1)+(ans<<3)+i-'0'; i=getchar();}
          return ans*f;
      }
      int n,m,tot;
      int trie[1000010][27],cnt[1000010];
      void insert(char* str) {
          int len=strlen(str),p=0;
          for(int i=0;i<len;i++) {
              int ch=str[i]-'a';
              if(!trie[p][ch]) trie[p][ch]=++tot;
              p=trie[p][ch];
          }
          cnt[p]++;
      }
      int search(char* str) {
          int ans=0;
          int len=strlen(str),p=0;
          for(int i=0;i<len;i++) {
              int ch=str[i]-'a';
              p=trie[p][ch];
              if(!p) return ans;
              ans+=cnt[p];
          }
          return ans;
      }
      int main()
      {
          char s[1000010];
          in(n); in(m);
          for(int i=1;i<=n;i++) {
              scanf("%s",s); insert(s);
          }
          for(int i=1;i<=m;i++) {
              scanf("%s",s);
              printf("%d\n",search(s));
          }
          return 0;
      }
      
      • -1
        @ 2022-11-10 20:02:32
        备注:
        ******************************************/
        #include <queue>
        #include <math.h>
        #include <stack>
        #include <stdio.h>
        #include <iostream>
        #include <vector>
        #include <iomanip>
        #include <string.h>
        #include <algorithm>
        #include <map>
        using namespace std;
        #define LL long long
        const int N = 1e6 + 10;
        const int INF = 0x3f3f3f3f;
        struct node
        {
        	int a[27], end;
        	node() 
        	{
        		memset(a, 0, sizeof a);
        		end = 0;
        	}
        }tr[N];
        int id = 0;   //id表示新儿子的下标 
        void add(string s)
        {
        	int head = 0, len = s.size();  //head表示当前节点的儿子 
        	for(int i = 0; i < len; i++)
        	{
        		int k = s[i] - 96;
        		if(!tr[head].a[k])
        			tr[head].a[k] = ++id;   //有儿子就处理,没儿子就加一个 
        		head = tr[head].a[k];
        	}
        	tr[head].end++;
        }
        int find(string s)
        {
        	int head = 0, len = s.size(), ans = 0;
        	for(int i = 0; i < len; i++)
        	{
        		int k = s[i] - 96;
        		head = tr[head].a[k];   //往下一个儿子走 
        		if(!head)
        			return ans;
        		ans += tr[head].end;  //tr[head].end表示以这个单词结尾的单词数量 
        	}
        	return ans;   //没有儿子就返回ans 
        }
        signed main()
        {
        	//freopen(".in", "r", stdin);
        	//freopen(".out", "w", stdout);
        	int n, m;
        	cin>>n>>m;
        	for(int i = 1; i <= n; i++)
        	{
        		string s;
        		cin>>s;
        		add(s);
        	}
        	for(int i = 1; i <= m; i++)
        	{
        		string s;
        		cin>>s;
        		cout<<find(s)<<endl;
        	}
        	return 0;
        }
        
        
        
        • 1

        信息

        ID
        53
        时间
        1000ms
        内存
        128MiB
        难度
        3
        标签
        递交数
        143
        已通过
        79
        上传者