传送门

1293 - Document Analyzer
Time Limit: 3 second(s) Memory Limit: 32 MB

You work in a leading software development company. As you are great in coding, most of the critical tasks are allotted for you. You like the challenge and you feel excited to solve those problems.

Recently your company is developing a project named Document Analyzer. In this project you are assigned a task; of course a critical task. The task is that you are given a document consisting of lowercase letters, numbers and punctuations. You have to analyze the document and separate the words first. Words are consecutive sequences of lower case letters. After listing the words, in the order same as they occurred in the document, you have to number them from 1, 2, ..., n. After that you have to find the range p and q (p ≤ q) such that all kinds of words occur between p and q (inclusive). If there are multiple such solutions you have to find the one where the difference of p and q is smallest. If still there is a tie, then find the solution where p is smallest.

Input

Input starts with an integer T (≤ 15), denoting the number of test cases.

Each case will be denoted by one or more lines denoting a document. Each line contains no more than 100 characters. A document will contain either lowercase letters or numbers or punctuations. The last line of a document will contain the word 'END' which is of course not the part of the document. You can assume that a document will contain between 1 and 50000 words (inclusive). Words may contain up to 10 characters. And a document can contain up to 5000 lines.

Output

For each case, print the case number and p and q as described above.

Sample Input

Output for Sample Input

3

1. a case is a case,

2. case is not a case~

END

a b c d e

END

a@#$a^%a a a

b b----b b++12b

END

Case 1: 6 9

Case 2: 1 5

Case 3: 5 6

Note

Dataset is huge, use faster I/O methods.

我也是醉了,输出少了个空格wa惨了,,,

题解:如标签,用两个指针start、end,往前扫,复杂度O(n)

484217 2015-03-14 08:05:52 1293 - Document Analyzer C++ 1.128 6928
Accepted 
 #include <cstdio>
#include <cstring>
#include <stack>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#include <string> #define ll long long
int const N = ;
int const M = ;
int const inf = ;
ll const mod = ; using namespace std; int cnt,T;
char s[];
map<string,int>mp;
int a[N];
int len;
int tot;
int vis[N];
int p,q;
int l;
char temp[N]; void ini()
{
p=-;q=;
int i,j;
mp.clear();
len=tot=;
memset(vis,,sizeof(vis));
while(scanf("%s",s)!=EOF && strcmp(s,"END")!=){
l=strlen(s);
// printf(" %s\n",s);
j=;
int ff=;
for(i=;i<l;i++){
if(s[i]>='a' && s[i]<='z'){
ff=;
temp[j]=s[i];
j++;
}
else{
if(ff==){
temp[j]='\0';
len++;
j=;
ff=;
if(!mp[temp]){
tot++;
mp[temp]=tot;
}
a[len]=mp[temp];
}
}
} if(ff==){
temp[j]='\0';
len++;
j=;
ff=;
if(mp[temp]==){
tot++;
mp[temp]=tot;
}
a[len]=mp[temp];
}
}
//printf(" len=%d tot=%d\n",len,tot);
//for(i=1;i<=len;i++){
// printf(" i=%d a=%d\n",i,a[i]);
//}
} void solve()
{
int i,j;
int now=;
i=;
j=;
while(i<=len)
{
//printf(" i=%d j=%d\n",i,j);
for(;j<=len;j++){
vis[ a[j] ]++;
if(vis[ a[j] ]==) now++;
if(now==tot){
//printf(" i=%d j=%d p=%d q=%d\n",i,j,p,q);
for(;i<=j;i++){
if(vis[ a[i] ]==){
//printf(" i=%d j=%d p=%d q=%d\n",i,j,p,q);
if(j-i<q-p){
p=i;q=j;
}
else if(j-i==q-p){
if(i<p){
p=i;q=j;
}
}
vis[ a[i] ]--;
now--;i++;j++;
break;
}
vis[ a[i] ]--;
}
break;
}
}
if(j==len+) break;
}
} void out()
{
printf("Case %d: %d %d\n",cnt,p,q);
} int main()
{
//freopen("data.in","r",stdin);
scanf("%d",&T);
for(cnt=;cnt<=T;cnt++)
//while(scanf("%d%d",&n,&m)!=EOF)
{
ini();
solve();
out();
}
}

lightoj 1293 - Document Analyzer [ 两指针 + 字符串 ]的更多相关文章

  1. ytu 1052: 写一函数,将两个字符串连接(水题,指针练习)

    1052: 写一函数,将两个字符串连接 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 343  Solved: 210[Submit][Status][ ...

  2. java中判断两个字符串是否相等的问题

    我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...

  3. c语言中的利用函数实现交换两个字符,交换两个字符串

    c语言交换两个字符: 方法一:利用指针传址,效率比较高 void swap(int *a,int *b) { int temp; temp = *a; *a = *b; *b = temp } 方法二 ...

  4. 【python】实例-python实现两个字符串中最大的公共子串

    由于python中的for循环不像C++这么灵活,因此该用枚举法实现该算法: C="abcdefhe" D="cdefghe" m=0 n=len(C) E=[ ...

  5. shell比较两个字符串是否相等

    比较两个字符串是否相等的办法是: if [ "$test"x = "test"x ]; then这里的关键有几点:1 使用单个等号2 注意到等号两边各有一个空格 ...

  6. js正则表达式的一些研究,截取两个字符串中间的字符串

    一个最常用的场景 截取两个字符串中间的字符串 var str = "iid0000ffr";    var substr = str.match(/id(\S*)ff/);    ...

  7. C#动态规划查找两个字符串最大子串

     //动态规划查找两个字符串最大子串         public static string lcs(string word1, string word2)         {            ...

  8. Python 比较两个字符串大小

    python 2中,有cmp(a,b)函数,用于比较两个字符串的大小. 如 >>>a='abc' >>>b='abd' >>>print cmp( ...

  9. 用Java编程找到两个字符串中共有的字符

    这道题的算法思想是把字符串1中的每个字符与字符串2中的每个字符进行比较,遇到共同拥有的字符,放入另一个数组中,最后顺序输出即可 但是这道题的难点在于怎么排除重复的字符 public class bot ...

随机推荐

  1. 成为Android高手必须掌握的8项基本要求

    [1] Android操作系统概述 1. Android系统架构. 2. Android利用设计理念. 3. Android 开源知识. 4. Android 参考网站与权威信息.[2] Androi ...

  2. 应用开始界面简单倒计时的dialog

    activity_main.xml 下面图片显示的还要在activity_main.xml里面加个TextView <?xml version="1.0" encoding= ...

  3. Android中进程与线程及如何在子线程中操作UI线程

    1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view ...

  4. mac自带终端安装完ohmyZsh后显示乱码

    修改描述文件-添加 选择新导入的 Meslo LG M Regular for Powerline

  5. web页面调用IOS的事件

    /** * js 调用ios的方法 * @param callback */ function connectWebViewJavascriptBridge(callback) { if (windo ...

  6. 15分钟学会使用Git

    http://blog.csdn.net/u013510614/article/details/50588446 主体思想 Git作为一个复杂的版本控制系统,命令之多,相信很多小白已经望而却步,有的尝 ...

  7. select2宽度占比100%,导致无法实现浮动效果

  8. MFC不同分辨率和缩放下正常显示的方法

    方法1:为了满足Windows操作系统上不同分辨率下的显示,我们在OnPaint中重绘.

  9. Windows 7桌面显示图标窗口句柄的获取

    在windows XP时代,我们获取桌面图标窗口的句柄往往用一下语句: HWND hwndParent = ::FindWindow( "Progman", "Progr ...

  10. Error:Failed to resolve: com.afollestad:material-dialogs:

    http://www.chenruixuan.com/archives/1068.html 背景: 同事把Android项目直接考给了我...我在Android Studio上运行,然后提示: Err ...