POJ1035&&POJ3080&&POJ1936

字符串处理专题,很早就写好了然而忘记写blog了

1035

题意:给你一些单词作为字典。然后让你查找一些单词。对于每个单词,如果在字典中就输出它。否则输出所有它通过删除||增加||替换一个字符能得到的单词

由于数据范围很小,所以我们直接暴力跑一下即可

CODE

#include<string>
#include<iostream>
#include<map>
using namespace std;
const int N=10005;
map <string,bool> hash;
string s[N],t;
int n,m;
inline void swap(string &a,string &b)
{
    string temp=a; a=b; b=temp;
}
inline bool cmp(string a,string b)
{
    int len_a=a.size(),len_b=b.size();
    if (len_a<len_b) swap(a,b),len_a=a.size(),len_b=b.size();
    if (len_a-len_b>1) return 0;
    if (len_a^len_b)
    {
        for (register int i=0;i<len_a;++i)
        {
            string temp=a;
            temp.erase(i,1);
            if (temp==b) return 1;
        }
        return 0;
    } else
    {
        int tot=0;
        for (register int i=0;i<len_a;++i)
        {
            if (tot>1) return 0;
            if (a[i]^b[i]) ++tot;
        }
        return tot<=1;
    }
}
int main()
{
    register int i;
    std::ios::sync_with_stdio(false);
    //freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
    while (cin>>s[++n],s[n]!="#")
    hash[s[n]]=1; --n;
    while (cin>>t,t!="#")
    {
        if (hash[t]) cout<<t<<" is correct"<<endl; else
        {
            cout<<t<<":";
            for (i=1;i<=n;++i)
            if (cmp(s[i],t)) cout<<" "<<s[i];
            cout<<endl;
        }
    }
    return 0;
}

3080

题意是给你一些字符串,让你找它们的最长公共字串

同样因为范围很小,所以只需要枚举+find即可

CODE

#include<iostream>
#include<string>
using namespace std;
string s[15],ans;
int n,m,len,tot;
int main()
{
    register int i,j,k;
    ios::sync_with_stdio(false);
    cin>>n;
    while(n--)
    {
        cin>>m; tot=0; ans="";
        for (i=1;i<=m;++i)
        cin>>s[i]; len=s[1].size();
        for (i=0;i<len;++i)
        for (j=len-1;j>=i+tot-1;--j)
        {
            string temp(s[1],i,j-i+1);
            bool flag=1;
            for (k=2;k<=m;++k)
            if (s[k].find(temp)==string::npos) { flag=0; break; }
            if (flag)
            {
                if (temp.size()>tot) tot=temp.size(),ans=temp; else
                if (temp.size()==tot&&temp<=ans) ans=temp;
            }
        }
        if (ans.size()<3) cout<<"no significant commonalities"<<endl; else cout<<ans<<endl;
    }
    return 0;
}

1936

题意:对于两个字符串,判断s1是否为s2的一个子序列

注意这里是子序列,所以不能上find,手动模拟一个一个查找即可

CODE

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s1[100005],s2[100005];
int len1,len2,p;
int main()
{
    register int i;
    while (scanf("%s%s",&s1,&s2)!=EOF)
    {
        len1=strlen(s1); len2=strlen(s2); p=0;
        bool flag=1;
        for (i=0;i<len1;++i)
        {
            while (s2[p]!=s1[i]&&p<len2) ++p; ++p;
            if (p>len2) { flag=0; break; }
        }
        puts(flag?"Yes":"No");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/cjjsb/p/8832028.html

时间: 2024-08-29 03:36:40

POJ1035&&POJ3080&&POJ1936的相关文章

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

POJ题目推荐(转载)

POJ推荐50题1.标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉.2.标记为A and B的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目.3.列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制.4.这里不少题目在BUPT ACM FTP上面都有代码,请大家合理利用资源.5.50个题目要求每个题目都要写总结,养成良好的习惯.6.这个列表的目的在于让大家对各个方面的算法有个了解,也许要求有些苛刻,教条,请大家谅

POJ题目分类

初期: 一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.     (2)最短路径算法(dijkstra,bellman-ford,floyd,he

嗷嗷嗷,kuangbin大大博客上拉的题

正在学(learning),未学(waiting),已学(cut  vovering) 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法:     (1)图的深度优先遍历和广度优先遍历.  

转:转一个搞ACM需要的掌握的算法. .

要注意,ACM的竞赛性强,因此自己应该和自己的实际应用联系起来.  适合自己的才是好的,有的人不适合搞算法,喜欢系统架构,因此不要看到别人什么就眼红,  发挥自己的长处,这才是重要的. 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,  因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打  出来.  1.最短路(Floyd.Dijstra,BellmanFord)  2.最小生成树(先写个prim,kruscal要用并查集,不好写)

算法初学者指南

摘自网络,对于这个训练计划,我只能膜拜,~ 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15 分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd.Dijstra,BellmanFord) 2. 最小生成树(先写个prim,kruscal要用并查集,不好写) 3.大数(高精度)加减乘除 4.二分查找. (代码可在五行以内) 5.叉乘.判线段相交.然后写个凸包. 6.BFS.DFS,同时熟练hash表(

POJ分类

初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-ford,floyd,heap+dijkstra) (poj1860,poj3259,p

超强的ACM题目类型总结

转:初期: 一.基本算法:       (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.       (4)递推.       (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:       (1)图的深度优先遍历和广度优先遍历.       (2)最短路径算法(dijkstra,bellman-