zoukankan      html  css  js  c++  java
  • 字符串训练之四

    https://www.luogu.org/problem/P2264

    看一眼就是水题

    方法应该很多,都可以乱搞出来

    我就找了两个比较好的做法

    一个是trie,还有一个是set

    trie

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<cmath>
    #include<queue>
    #include<stack>
    #include<map>
    #include<set>
    #include<iostream>
    #include<algorithm>
    #include<string>
    #define rep(i,x,y) for(register int i = x;i <= y;++i)
    #define repd(i,x,y) for(register int i = x;i >= y;--i)
    using namespace std;
    typedef long long ll;
    int n,sz,ans,cnt = 1,val[1000000];
    char trie[100000][27]; 
    void trie_build(char*s,int len)
    {
    	int x = 0;
    	rep(i,1,len) {
    		if(!trie[x][s[i]]) trie[x][s[i]] = ++sz;
    		x = trie[x][s[i]];
    	}
    	val[x] = -1;
    }
     
    bool trie_find(char*s,int len)
    {
    	int x = 0;
    	rep(i,1,len)
    	{
    		if(s[i] < 'a' || s[i] > 'z' || !trie[x][s[i]]) return false;
    		x = trie[x][s[i]];
    	}
    	if(val[x] != cnt && val[x])return val[x] = cnt,true;
    	return false;
    }
     
    int main()
    {
    	freopen("qs.in","r",stdin);
    	scanf("%d",&n);getchar();
    	char s[100],c;
    	int len;
    	rep(i,1,n) {
    		len = 0;
    		while((c = getchar()) != '
    ' && c != ' ') {
    			if(c >= 'A' && c <= 'Z') c += 32;
    			s[++len] = c;
    		}
    		trie_build(s,len);
    	}
    	len = 0;
    	while((c = getchar()) != EOF)
    	{
    		if(c == ' ' || c == '.' || c == ',') {	
    			if(trie_find(s,len)) ans++;
    			len = 0; if(c == '.') ++cnt;
    			continue;
    		}
    		if(c >= 'A' && c <= 'Z') c += 32;
    		s[++len] = c;
    	}
    	if(trie_find(s,len)) ans++;
    	cout<<ans;
    	return 0;
    }
    

    set

    #include<bits/stdc++.h>
    using namespace std;
    set<string>se,se2;
    int ans,n;
    int main()
    {
        scanf("%d",&n);
        string a;
        for(int i=1;i<=n;i++){
            cin>>a;
            for(int i=0;i<a.length();i++)
                if(a[i]>='a'&&a[i]<='z') a[i]-=32;
            se.insert(a); 
        }
        char ch=getchar();
        string b;
        while(scanf("%c",&ch)==1){
            if(ch=='
    ')break;
            if((ch>='A'&&ch<='Z')||(ch>='a'&&ch<='z')){
                if(ch>='a'&&ch<='z')ch=ch-32;
                b+=ch;
            }
            else{
                if(!b.empty()){
                    if(se.count(b))se2.insert(b);
                    b.clear();
                }
                if(ch=='.')ans+=se2.size(),se2.clear();
            }
        }
        printf("%d
    ",ans);
        return 0;
    }
    
  • 相关阅读:
    【转】CRC校验
    【转】MapReduce程序的工作过程
    【转】hadoop机架感知
    【转】git常用命令
    Code Examples for scala actor link
    【转】ThreadLocal原理及其实际应用
    【转】scala解惑: 偏函数与部分应用函数
    (九)Maven坐标详解
    (八)Eclipse创建Maven项目运行mvn命令
    (七)Maven使用的最佳实践
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/11624872.html
Copyright © 2011-2022 走看看